반응형
문제 링크 : https://www.acmicpc.net/problem/1913
풀이
우선, 구현에 쓰인 변수는 크게 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 |