본문 바로가기
Programming Solve/BOJ

BOJ 1913 - 달팽이 / C++

by msm1029 2022. 3. 22.
반응형

문제 링크 : https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

 

풀이

우선, 구현에 쓰인 변수는 크게 3가지이다.

좌표(x, y) / 방향(goDown,Right,Up,Left) / 라운드(r) 이다.

 

달팽이의 구현을 보면 (0, 0)에서 n^2부터 시작하여 하-우-상-좌 순서로 돌게 된다.

또한, 배열을 벗어나면 안되기 때문에 각 좌표는 n을 벗어나거나 0보다 작아지면 안된다.

 

하지만 왼쪽으로 갈 때를 보면 0보다 작아지는 것이 아니라 1보다 작아지면 안되는 것을 알 수 있다.

n = 3일 때를 생각해보면

9    3

8    4

7 6 5 까지 채우고 나서 왼쪽으로 이동하며 배열을 채우는데 이미 (0, 0)은 채워져있다.

따라서 1까지만 이동하고 다시 아래로 향해야한다. 이 때, 라운드 변수 r이 사용된다.

 

 

코드

#include <iostream>
using namespace std;

int arr[1000][1000];

int main(){
    int n, m;
    cin >> n >> m;

    int y = 0, x = 0, r = 0;
    bool goDown = true, goRight = false, goUp = false, goLeft = false;
    
    for(int i=n*n; i>0; i--){
        arr[y][x] = i;

        if(goDown){
            y++;
            if(y >= n - r){
                y--;
                x++;
                goDown = false;
                goRight = true;
            }
        }
        else if(goRight){
            x++;
            if(x >= n - r){
                x--;
                y--;
                goRight = false;
                goUp = true;
            }
        }
        else if(goUp){
            y--;
            if(y < r){
                y++;
                x--;
                r++;
                goUp = false;
                goLeft = true;
            }
        }
        else if(goLeft) {
            x--;
            if(x < r){
                x++;
                y++;
                goLeft = false;
                goDown = true;
            }
        }
    }

    int ansY, ansX;

    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << arr[i][j] << ' ';
            if(arr[i][j] == m){
                ansY = i;
                ansX = j;
            }
        }
        cout << '\n';
    }

    cout << ansY + 1 << ' ' << ansX + 1;
}
반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 9663 - N-Queen / C++  (0) 2022.03.28
BOJ 14888 - 연산자 끼워넣기 / C++  (0) 2022.03.28
BOJ 4486 - 녹색 옷 입은 애가 젤다지? / C++  (0) 2022.03.20
BOJ 1238 - 파티 / C++  (0) 2022.03.20
BOJ 2503 - 숫자 야구 / C++  (0) 2022.03.10