Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 10703번 - μœ μ„±

dkswnkk 2022. 9. 21. 11:52

문제

 

10703번: μœ μ„±

μž‘κ³  νŠΉμ΄ν•œ λͺ¨μ–‘μ˜ μœ μ„± 사진이 인터넷에 μ˜¬λΌμ™”λ‹€. μ‚¬μ§„μ—λŠ” 맀우 높은 κ³³μ—μ„œ λ–¨μ–΄μ§€κ³  μžˆλŠ” μœ μ„±μ΄ ν—ˆκ³΅μ— μ°ν˜€ μžˆμ—ˆλ‹€. μœ μ„±μ΄ λ–¨μ–΄μ§€κ³  λ‚œ λ’€μ˜ 사진도 μžˆμ—ˆμ§€λ§Œ μ•ˆνƒ€κΉκ²Œλ„ μ†Œμ‹€λΌλ²„λ €

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
using namespace std;

int N, M;

char map[3001][3001];
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>N>>M;;
    for(int i=0; i<N; i++){
        string inp; cin>>inp;
        for(int k=0; k<M; k++){
            map[i][k] = inp[k];
        }
    }
    
    int move_cnt = 1e9;
    for(int i=0; i<M; i++){ // λͺ‡ μΉΈ 이동할지 μ°ΎκΈ°
        int meteor = 0;
        int ground = 0;
        for(int k=0; k<N; k++){
            if(map[k][i] == 'X') meteor = k + 1;
            if(map[k][i] == '#'){
                ground = k + 1;
                break;
            }
        }
        if(meteor !=0 && ground != 0){
            move_cnt = min(move_cnt, ground - meteor - 1);
        }
    }
    
    for(int i=0; i<M; i++){ // μœ μ„± 이동
        for(int k=N-1; k>=0; k--){
            if(map[k][i] == 'X'){
                map[k+move_cnt][i] = 'X';
                map[k][i] = '.';
            }
        }
    }
    for(int i=0; i<N; i++){ // 좜λ ₯
        for(int k=0; k<M; k++){
            cout<<map[i][k];
        }
        cout<<'\n';
    }
}

 

풀이

문제λ₯Ό λ¨Όμ € 이해해 보자면 μ™Όμͺ½ μž…λ ₯μ—μ„œ x(μœ μ„±) 뭉텅이λ₯Ό λ•…(#) μœ„κΉŒμ§€ 내릴 수 μžˆμ„ 만큼 μ΅œλŒ€ν•œ λ‚΄λ €μ•Ό ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ κ°€μž₯ 땅에 κ·Όμ ‘ν•œ X(μœ μ„±)을 μ°Ύμ•„μ„œ ν•΄λ‹Ή μœ μ„±κ³Ό λ•…κ³Όμ˜ 거리만큼 전체 μœ μ„±μ„ 내리면 λ©λ‹ˆλ‹€.

μœ„ μž…λ ₯ 같은 경우 (1, 3)의 μœ μ„±κ³Ό (3, 3)의 λ•…κ³Όμ˜ 거리차가 제일 μž‘κ³ , 거리 μ°¨μ΄λŠ” ν•œ μΉΈμž…λ‹ˆλ‹€. λ”°λΌμ„œ 전체 μœ μ„±μ„ μ•„λž˜λ‘œ ν•œ μΉΈ 내리면 λ©λ‹ˆλ‹€.