문제 링크 : www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
문제
홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
9 | 2 | 3 |
8 | 1 | 4 |
7 | 6 | 5 |
25 | 10 | 11 | 12 | 13 |
24 | 9 | 2 | 3 | 14 |
23 | 8 | 1 | 4 | 15 |
22 | 7 | 6 | 5 | 16 |
21 | 20 | 19 | 18 | 17 |
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
접근 방법
1) N에 따른 회오리 수를 구해준다. (N/2번)
2) 각 회오리마다 시작 지점의 행과 열을 지정한다. (N/2 -1, N/2 -1)
3) 방향을 나타내는 배열 dr[4], dc[4]의 방향을 오, 아, 왼, 위 순서로 지정한다.
4) 시작 지점에서 전진을 하면서 숫자를 하나씩 증가시키며 이차원 배열을 채워 넣고, 일정 범위를 넘어가면 전진 방향을 바꾼다.
5) 이때 범위는 몇번째 회오리인지에 따라 달라지는데, 회오리가 i 번째라고 하면 행과 열의 범위는 N/2-i ~ N/2+i 가 된다.
회오리 하나의 칸을 다 채웠으면 다음 바깥쪽의 회오리를 채우며, 다음 회오리로 넘어갈 때 시작 지점을 행-1, 열-1 로 지정한다.
// // SM_BOJ1913_ 달팽이.cpp // Coding_Test_Practice // // Created by 김난영 on 2021/05/01. // Copyright © 2021 KimNanyoung. All rights reserved. // #include <iostream> #include <utility> using namespace std; //오 아 왼 위 int dr[4] = {0,1,0,-1}; int dc[4] = {1,0,-1,0}; int map[1000][1000]; int main(){ pair<int,int> p; int N, x; cin >> N >> x; int rotateCnt = N/2; //회오리 수 int num = 1; map[N/2][N/2] = num; int startR = N/2 -1; int startC = N/2 -1; for(int i = 1; i<=rotateCnt; i++){ int r = startR; int c = startC; for(int d = 0; d<4;){ int nr = r + dr[d]; int nc = c + dc[d]; if((N/2 -i<=nr && nr<=N/2+i) && (N/2 -i<=nc && nc<=N/2+i)){ num+=1; map[nr][nc] = num; if(num==x){ p.first = nr + 1; p.second = nc + 1; } r = nr; //다음 칸 전진 c = nc; } else{ //범위 넘어갔으니 방향 바꿔야함 d++; } } //시작점 바꾸기 -1, -1 startR -= 1; startC -= 1; } for(int i = 0; i<N; i++){ for(int j = 0; j<N; j++){ cout << map[i][j] << " "; }cout << endl; } cout << p.first << " " << p.second ; return 0; }

'Algorithm(BOJ) > Simulation' 카테고리의 다른 글
[Java] 백준 1662번 - 압축 (0) | 2023.02.26 |
---|---|
[C++] 백준 1952번 - 달팽이2 (구현) (0) | 2021.05.01 |
[C++] 백준 16236번 - 아기 상어 (구현) (0) | 2021.03.25 |
[C++] 백준 16976번 - 배열 복원하기 (구현) (0) | 2021.03.25 |
[C++] 백준 20055번 - 컨베이어 벨트 위의 로봇 (구현) (0) | 2021.03.24 |