코딩테스트 준비/백준

[백준 1913] - 달팽이(구현) C++

SeoburiFaust 2024. 3. 22. 01:25

문제

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

 

1913번: 달팽이

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

www.acmicpc.net

접근방법

문제 풀이 과정은 다음과 같다.

1. N^2부터 계속 숫자를 감소시킨다.

2. 방향 변수를 두어 방향을 컨트롤 한다.

3. k변수를 두어서 끝 지점을 정하고 가는 방향의 끝에 도달하면 방향을 바꾼다.

 

추가로, 나는 벽에 끝에 도달했을 경우를 변수로 판별했는데, 이걸 2차원 배열에서 방향을 바꿀 곳을 true로 놓고 체크할 수도 있었다.

다시말하면, 이차원 배열을 만들고 꼭짓점에 1을 넣어서 꼭짓점에 도착한 경우 방향을 틀게 하는 방법이다.

이 방법을 사용하면 코드를 더 간단하게 작성할 수 있다.

코드

#include <iostream>
#include <vector>


using namespace std;

#define FASTER ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

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

int main() {
    FASTER
    int n; int num;
    cin >> n >> num;
    int k = n;
    int y = 0, x = 0;
    int dir = 0;
    vector<vector<int>> graph(n, vector<int>(n));
    for (int i=n*n;i>=1;i--) {  
        if (dir == 0 && y == k-1) dir++;
        else if (dir == 1 && x == k-1) dir++;
        else if (dir == 2 && y == n - k) dir++;
        else if (dir == 3 && x == n - k + 1) {
            dir = 0;
            k--;
        }
        graph[y][x] = i;
        y += dy[dir];
        x += dx[dir];
    }
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++) {
            cout << graph[i][j] << " ";
        }
        cout << '\n';
    }
    bool flag = false;
    for (int i=0;i<n && !flag;i++) {
        for (int j=0;j<n && !flag;j++) {
            if (graph[i][j] == num) {
                cout << i+1 << " " << j+1 << '\n';
                flag = true;
            }
        }
    }
    return 0;
}

개선할 점

어떻게 구현해야할 지 막막해서 머리가 멍해지는데, 가만히 보고 있지말고 자꾸 종이에 뭐라도 끄적이거나 코드를 계속 작성해야 한다.

 

그래야 빨리 풀 수 있다. 이번 문제같은 경우에는 구현이 섬세해야해서 막막했는데, 직접 코드를 짜보니까 생각보다 쉽게 풀렸다.