Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6-rivkms #20

Merged
merged 2 commits into from
Mar 4, 2024
Merged

6-rivkms #20

merged 2 commits into from
Mar 4, 2024

Conversation

rivkms
Copy link
Collaborator

@rivkms rivkms commented Feb 27, 2024

πŸ”— 문제 링크

ν† λ§ˆν† 

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

2H (문제 ν‘ΈλŠ” 방법을 쑰금 λ³€ν˜•ν–ˆλ”λ‹ˆ μ‹œκ°„μ΄ 더 λŠ˜μ–΄λ‚¬λ„€μš”)

✨ μˆ˜λ„ μ½”λ“œ

πŸ“ 참고사항

이번 문제λ₯Ό 가지고 온 μ΄μœ λŠ”, 사싀 2차원 배열을 1차원 λ°°μ—΄λ‘œ μƒκ°ν•˜μ—¬ 풀어보기 μœ„ν•¨μ΄μ—ˆμŠ΅λ‹ˆλ‹€.
이 문제λ₯Ό 2차원 λ°°μ—΄λ‘œ 풀어도 λ¬Έμ œλŠ” 없을 것 κ°™μœΌλ‚˜, 1차원 λ°°μ—΄λ‘œ λ°”κΎΈμ–΄ ν’€μ–΄λ³΄μ‹œλŠ” 것도 쒋을 λ“― ν•©λ‹ˆλ‹€ γ…Žγ…Ž

β€» 2차원 λ°°μ—΄ map[i][j]λ₯Ό 1차원 λ°°μ—΄λ‘œ λ§Œλ“ λ‹€κ³  ν•˜λ©΄ map[i*w+j]둜 λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€.

βœ”οΈ 문제

M*N의 μƒμžμ˜ 정보가 주어진닀. 이 λ•Œ ν•˜λ£¨κ°€ 지날 λ•Œλ§ˆλ‹€ μ΅μ–΄μžˆλŠ” ν† λ§ˆν† μ— μ˜ν•΄ μƒν•˜μ’Œμš°μ˜ ν† λ§ˆν† κ°€ μ΅λŠ”λ‹€.
이 λ•Œ μƒμžμ— μžˆλŠ” λͺ¨λ“  ν† λ§ˆν† κ°€ 읡을 λ•Œ κΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯ν•˜κ³ , λͺ¨λ‘ 읡지 λͺ»ν•˜λ©΄ -1을 좜λ ₯ν•œλ‹€.

βœ”οΈ μ ‘κ·Ό 방법

1️⃣ μž…λ ₯을 λ°›μ•„λ³΄μž

  1. vector인 map에 μ΄ˆκΈ°μƒνƒœλ₯Ό μ €μž₯ν•˜μž.
  2. 이 λ•Œ 읡은 ν† λ§ˆν† (1)의 μœ„μΉ˜λ„ queue에 μ €μž₯ν•˜μž.

2️⃣ queue의 끝에 -1을 μ €μž₯ν•˜μž. (ν•˜λ£¨κ°€ μ§€λ‚¬μŒμ„ μ˜λ―Έν•˜λŠ” -1)

3️⃣ while문을 μ„€μ •ν•˜μ—¬ queueκ°€ 빌 λ•ŒκΉŒμ§€ μˆ˜ν–‰ν•œλ‹€.

  1. queueμ—μ„œ 맨 μ•žμ˜ 값을 popν•˜μž
  2. λ§Œμ•½ κ·Έ 값이 -1일 λ•Œ, queueμ•ˆμ— 더 이상 값이 μ—†λ‹€λ©΄ while문을 μ’…λ£Œν•œλ‹€.
  3. 그렇지 μ•Šλ‹€λ©΄ λ‚ μ§œ(s)λ₯Ό ν•˜λ£¨λ₯Ό μ¦κ°€μ‹œν‚€κ³  queue에 -1을 λ„£λŠ”λ‹€.
  1. queueμ—μ„œ popν•œ μœ„μΉ˜μ˜ μƒν•˜μ’Œμš°μ˜ ν† λ§ˆν† κ°€ 읡지 μ•Šμ•˜λ‹€λ©΄( 0이라면 ), 읡도둝 λ§Œλ“ λ‹€( 1둜 λ§Œλ“ λ‹€ )
  2. λ§Œμ•½ 4에 μ˜ν•΄ ν† λ§ˆν† κ°€ 읡게 λ˜μ—ˆλ‹€λ©΄, 읡게 된 ν† λ§ˆν† μ˜ μœ„μΉ˜λ₯Ό queue에 λ„£λŠ”λ‹€.

4️⃣ ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ—ˆλŠ”μ§€ ν™•μΈν•˜μ—¬ μ΅œμ†Œ λ‚ μ§œλ₯Ό 좜λ ₯ν•œλ‹€.

  1. map에 0이 λ‚¨μ•„μžˆμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.
  2. 그렇지 μ•Šλ‹€λ©΄ sλ₯Ό 좜λ ₯ν•œλ‹€.

πŸ–₯️ μ½”λ“œ

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
int SIZE;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int w, h, s = 0;
    cin >> w >> h;
    SIZE = w*h;

    vector<int> box(SIZE);
    queue<int> q;

    for(int i = 0; i<SIZE; i++){
        cin >> box[i];
        if(box[i]==1){
            q.push(i);
        }
    }
    q.push(-1);
    while(!q.empty()){
        int tmp = q.front();
        q.pop();
        if(tmp == -1){
            if(q.empty()){
                break;
            }
            s++;
            q.push(-1);
            continue;
        }
        int x = tmp%w;
        int y = tmp/w;
        for(int i = 0; i<4; i++){
            if(x+1<w && box[y*w+x+1]==0){
                box[y*w+x+1] = 1;
                q.push(y*w+x+1);
            }
            else if(y+1<h&&box[(y+1)*w+x]==0){
                box[(y+1)*w+x] = 1;
                q.push((y+1)*w+x);
            }
            else if(x>0 && box[y*w+x-1]==0){
                box[y*w+x-1] = 1;
                q.push(y*w+x-1);
            }
            else if(y>0 && box[(y-1)*w+x]==0){
                box[(y-1)*w+x] = 1;
                q.push((y-1)*w+x);
            }
        }
    }
    for(int y = 0; y<h; y++){
        for(int x = 0; x<w; x++){
            if(box[y*w+x]==0){
                cout << -1;
                return 0;
            }
        }
    }
    cout << s;

    return 0;
}

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

βœ”οΈμ²˜μŒμ— μ ‘κ·Όν•  λ•Œμ—λŠ” 맀 λ°˜λ³΅λ§ˆλ‹€ map을 ν™•μΈν•˜κ³ , λ³€ν™”λ₯Ό ν™•μΈν•˜λŠ” 과정을 κ±°μ³€μŠ΅λ‹ˆλ‹€. ( 7576_2.cpp μ°Έκ³  )
이 μ½”λ“œλ‘œ ν•˜λ‹ˆ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€.
맀번 전체 map을 ν™•μΈν•˜λŠ” κ²ƒμ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•œλ‹€κ³  μƒκ°ν•˜μ—¬ queueλ₯Ό μ΄μš©ν•˜μ—¬ κ·Έ μ‹œκ°„μ„ μ€„μ˜€κ³  μ„±κ³΅μ μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

βœ”οΈ 2차원 배열을 1차원 λ°°μ—΄λ‘œ λ°”κΎΈμ–΄ 계산을 ν•˜λŠ” 것을 보고 μ‹ κΈ°ν•˜μ—¬ 이 μ½”λ“œλ₯Ό 짜본 것인데, μƒˆλ‘œμš΄ 방식을 μ•Œκ²Œ λ˜μ–΄ μ’‹μ•˜μŠ΅λ‹ˆλ‹€.

Copy link
Member

@kjs254 kjs254 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ „ν˜•μ μΈ BFS문제λ₯Ό μ •μ„μ μœΌλ‘œ 잘 ν’€μ–΄λ‚΄μ‹  것 κ°™μŠ΅λ‹ˆλ‹€.

λ˜ν•œ, 2차원 λ°°μ—΄ map[y][x] λ₯Ό κ°€μ€‘μΉ˜ wλ₯Ό μ‚¬μš©ν•΄ 1차원 λ°°μ—΄ map[y*w+x]둜 잘 ν‘œν˜„ν•˜μ‹  것 κ°™μŠ΅λ‹ˆλ‹€.

이 λ‘˜μ˜ 차이가 μ—°μ‚° 속도에 크게 영ν–₯이 적닀고 μƒκ°λ˜λŠ”λ° μ‹€μ œλ‘œ κ·ΈλŸ°κ°€μš”?

Comment on lines +28 to +30
if(tmp == -1){
if(q.empty()){
break;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

queueλ₯Ό μ‚¬μš©ν•˜μ—¬ map을 일일히 νƒμƒ‰ν•˜μ§€ μ•Šκ³ λ„ ν† λ§ˆν† κ°€ λ‹΄κΈ΄ μœ„μΉ˜ λ§Œμ„ λ°°μΆœν•˜λŠ” 것이 μΈμƒμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

@rivkms
Copy link
Collaborator Author

rivkms commented Mar 1, 2024

μ „ν˜•μ μΈ BFS문제λ₯Ό μ •μ„μ μœΌλ‘œ 잘 ν’€μ–΄λ‚΄μ‹  것 κ°™μŠ΅λ‹ˆλ‹€.

λ˜ν•œ, 2차원 λ°°μ—΄ map[y][x] λ₯Ό κ°€μ€‘μΉ˜ wλ₯Ό μ‚¬μš©ν•΄ 1차원 λ°°μ—΄ map[y*w+x]둜 잘 ν‘œν˜„ν•˜μ‹  것 κ°™μŠ΅λ‹ˆλ‹€.

이 λ‘˜μ˜ 차이가 μ—°μ‚° 속도에 크게 영ν–₯이 적닀고 μƒκ°λ˜λŠ”λ° μ‹€μ œλ‘œ κ·ΈλŸ°κ°€μš”?

βœ”οΈ μœ„μ˜ μ½”λ“œμ™€ κ°™μ§€λ§Œ, 2차원 λ°°μ—΄λ‘œ λ°”κΎΈμ–΄ μž‘μ„±ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€!!

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
int SIZE;

int main(){
    ios_base::sync_with_stdio(false);
	cin.tie(NULL);
    int w, h, s = 0;
    cin >> w >> h;
    
    vector<vector<int>> box(h, vector<int> (w,0));
    queue<pair<int, int>> q;

    for(int i = 0; i <h; i++){
        for(int j = 0; j < w; j++){
            cin >> box[i][j];
            if(box[i][j] == 1){
                q.push(pair<int, int>(i, j));
            }
        }
    }
    q.push(pair<int, int> (-1, 0));
    while(!q.empty()){
        pair<int, int> tmp = q.front();
        q.pop();
        if(tmp.first == -1){
            if(q.empty()){
                break;
            }
            s++;
            q.push(pair<int, int> (-1,0));
            continue;
        }
        for(int i = 0; i<4; i++){
            if(tmp.second+1<w && box[tmp.first][tmp.second+1] == 0){
                box[tmp.first][tmp.second+1] = 1;
                q.push(pair<int, int> (tmp.first, tmp.second+1));
            }
            else if(tmp.first+1<h && box[tmp.first+1][tmp.second] == 0){
                box[tmp.first+1][tmp.second] = 1;
                q.push(pair<int, int> (tmp.first+1, tmp.second));
            }
            else if(tmp.second>0 && box[tmp.first][tmp.second-1] == 0){
                box[tmp.first][tmp.second-1] = 1;
                q.push(pair<int, int> (tmp.first, tmp.second-1));
            }
            else if(tmp.first>0 && box[tmp.first-1][tmp.second] == 0){
                box[tmp.first-1][tmp.second] = 1;
                q.push(pair<int, int> (tmp.first-1, tmp.second));
            }
        }
    }
    for(int y = 0; y<h; y++){
        for(int x = 0; x<w; x++){
            if(box[y][x]==0){
                cout << -1;
                return 0;
            }
        }
    }
    cout << s;

    return 0;
}

λ‹€μŒκ³Ό 같이 λ‚˜μ˜€λŠ”λ°μš”.

βœ”οΈ 이 λ•Œ μ‹œκ°„μ„ 비ꡐ해보면
image

μœ„μͺ½μ΄ 1차원 λ°°μ—΄, μ•„λž«μͺ½μ΄ 2차원 λ°°μ—΄μž…λ‹ˆλ‹€.

‼️ μ•½κ°„μ˜ μ°¨μ΄λŠ” λ‚˜λŠ” 것 κ°™λ„€μš”. μ•„λ§ˆ 자료의 크기가 컀지면 더 μ»€μ§ˆμˆ˜λ„ μžˆμ„ λ“― ν•©λ‹ˆλ‹€.
μ§€κΈˆ μƒν™©μ—μ„œλŠ” 크게 차이가 λ‚˜μ§€ μ•ŠλŠ” κ±° 같기도 ν•˜μ§€λ§Œ, ν•„μš”ν•œ λ•Œκ°€ μžˆμ„ μˆ˜λ„ μžˆμœΌλ‹ˆ μ•Œκ³  κ³„μ‹œλ©΄ 도움이 λ˜μ‹€ 것 같기도 ν•©λ‹ˆλ‹€.

Copy link
Collaborator

@YIM2UL2ET YIM2UL2ET left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

큐λ₯Ό μ΄μš©ν•˜λŠ” 정석적인 문제 같은데 큐 λ³΅μŠ΅μ— 쑰금 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

2차원 배열을 1μ°¨μ›μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 이유λ₯Ό μ°Ύμ•„λ³΄λ‹ˆ κ°€μž₯ 큰 μ΄μœ κ°€ μ˜€λ²„ν—€λ“œκ°€ μ—†λ‹€κ³  ν•˜λ„€μš”. (참고자료: 링크)

κ·Ήν•œμ˜ μ„±λŠ₯을 좔ꡬ해야 ν•˜κ±°λ‚˜, λ°°μ—΄ 크기가 λ„ˆλ¬΄ μ»€μ„œ μ˜€λ²„ν—€λ“œκ°€ 많이 λ°œμƒν•˜λŠ” 상황이 μ•„λ‹ˆλΌλ©΄ μ €λŠ” 계속 2차원 배열을 μ‚¬μš©ν•  것 κ°™μœΌλ‚˜, 1차원 배열을 μ‚¬μš©ν•˜λŠ” 상황이 올 λ•Œλ₯Ό λŒ€λΉ„ν•΄μ„œ 저도 1차원 배열을 μ‚¬μš©ν•˜λŠ” 방법도 μ—°μŠ΅ν•΄μ•Όκ² λ„€μš”. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!

Copy link
Collaborator

@mong3125 mong3125 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1차원 배열이 λΉ λ₯Έ μ΄μœ λŠ” μΊμ‹œλ©”λͺ¨λ¦¬ 덕뢄일 μˆ˜λ„ μžˆκ² λ‹€λŠ” 생각이 λ“œλ„€μš”.
λ©”λͺ¨λ¦¬ μ •λ ¬κ³Ό μΊμ‹œ

μ €λŠ” μ½”λ“œ 직관성이 떨어진닀고 μƒκ°ν•΄μ„œ 잘 μ‚¬μš©ν•˜μ§„ μ•ˆμ„κ²ƒ 같은데 μƒˆλ‘œμš΄ 접근법을 배울 수 μžˆμ–΄μ„œ μ’‹μ•˜μŠ΅λ‹ˆλ‹€.

@rivkms rivkms merged commit 16b556f into main Mar 4, 2024
@rivkms rivkms deleted the 6-rivkms branch March 4, 2024 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants