PS/BOJ

백준 1913번 (C++) 달팽이

akinakamori 2022. 8. 11. 23:13
728x90
SMALL

https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

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

www.acmicpc.net

 

 

정-직하게 2차원 배열의 가운데부터 1씩 증가하며

달팽이 모양(상, 우, 하, 좌) 순으로 2차원 배열을 탐색했다.

 

 

내가 이미 채운 곳이라면 (이미 어떤 cnt라는 정수가 채워져 0이 아니라면)

왔던 방향을 한번 더 가면된다. 

 

 

이는 곧 현재의 방향을 나타내는 iterator i를 2 감소하면 된다.

1을 감소하면 되는게 맞지만,

현재 내가 수행한 반복문의 끝에서 1이 증가하므로 그것까지 고려해 2를 감소한다.

 

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    int N, M;
    cin >> N >> M;
    
    vector<vector<int>> v(N, vector<int>(N, 0));
    
    int x = (N - 1) / 2;
    int y = x;
    int cnt = 1;
    
    v[x][y] = cnt++;
    while (cnt <= N*N) {
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx < 0 || nx >= N || ny < 0 || ny >= N) {
                continue;
            }
            if (v[nx][ny] != 0) {
                if (i == 0) i = 2;
                else if (i == 1) i = 3;
                else i-=2;
            }
            else {
                v[nx][ny] = cnt++;
                x = nx; y = ny;
            }
        }
    }
    int ans_x, ans_y;
    
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout << v[i][j] << " ";
            if (v[i][j] == M) {
                ans_x = i+1; ans_y = j+1;
            }
        }
        cout << endl;
    }
    cout << ans_x << " " << ans_y;
    return 0;
}

 

 

728x90
LIST

'PS > BOJ' 카테고리의 다른 글

백준 1389 (python) 케빈 베이컨의 6단계 법칙  (2) 2022.08.29
왜 안풀림  (4) 2022.08.15
백준 2468 (C++) 안전 영역  (0) 2022.03.20
백준 14442 (C++) 벽 부수고 이동하기 2  (2) 2022.03.18
백준 2644 (C++) 촌수계산  (2) 2022.03.12