문제
https://www.acmicpc.net/problem/1913
접근방법
문제 풀이 과정은 다음과 같다.
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;
}
개선할 점
어떻게 구현해야할 지 막막해서 머리가 멍해지는데, 가만히 보고 있지말고 자꾸 종이에 뭐라도 끄적이거나 코드를 계속 작성해야 한다.
그래야 빨리 풀 수 있다. 이번 문제같은 경우에는 구현이 섬세해야해서 막막했는데, 직접 코드를 짜보니까 생각보다 쉽게 풀렸다.
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준 10973] - 이전 순열(구현) C++ (0) | 2024.03.22 |
---|---|
[백준 2503] - 숫자 야구(구현) C++ (0) | 2024.03.21 |
[백준 - 15686] - 치킨 배달(구현) C++ (0) | 2024.03.21 |
[백준 14502] - 연구소(구현) C++ (0) | 2024.03.21 |
[백준 - 1283] - 단축키 지정(구현) C++ (0) | 2024.03.20 |