지우너

[코드트리] 숫자가 더 큰 인접한 곳으로 이동 C++ 본문

Problem Solving

[코드트리] 숫자가 더 큰 인접한 곳으로 이동 C++

지옹 2024. 6. 7. 08:51

문제

https://www.codetree.ai/missions/2/problems/move-to-larger-adjacent-cell?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

계획세우기

  1. 상하좌우를 살피면서 중앙의 값과 비교
  2. 중앙의 값보다 큰 값이 있으면 해당 값으로 max 값을 갱신해주고, x, y위치를 옮겨준다.(상하좌우 우선순위에 따라 움직이기 때문에 다른 곳에 더 큰 값이 있어도 가장 먼저 만난 자신보다 큰 값으로 갱신됨)
  3. 상하좌우를 다 살폈는데 갱신된 적이 없다면 while 무한 반복을 나와준다.

 

풀이

#include <iostream>

using namespace std;

int n;
int arr[101][101];

void Move(int r, int c){
    //상(-1,0)하(1,0)좌(0,-1)우(0,1) 방향 순서대로 우선순위
    int dx[4]={-1, 1, 0, 0};
    int dy[4]={0, 0, -1, 1};

    int x=r, y=c;
    while(true){
        cout << arr[x][y] << " ";

        int maxNum=arr[x][y];
        bool isUpdated=false;

        for(int dir=0; dir<4; dir++){
            int nx=x+dx[dir];
            int ny=y+dy[dir];

            if(nx<0 || nx>=n || ny<0 || ny>=n) continue;
            if(arr[nx][ny]>maxNum){
                isUpdated=true;
                maxNum=arr[nx][ny];
                x=nx;
                y=ny;
                break;
            }
        }
        if(!isUpdated) break;
    }
    
}
int main() {
    int r, c;
    cin >> n >> r >> c;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> arr[i][j];
        }
    }

    Move(r-1, c-1);

    return 0;
}