링크 : https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
- 문제
- 소요시간: 구현 15분, 디버깅 40분


- 설계하기(접근방법)
1. n과 target 을 입력받는다
2. 구현
달팽이 모양의 배열은
n* n으로 이루어져 있으며 배열의 형태는
ex) n = 7 인 경우
n - 1개만큼
49
48
47
46
45
44으로 밑으로 뻗고
43 42 41 40 39 38 까지 오른쪽으로 뻗고
32
33
34
35
36
37 위쪽으로 뻗고
26 27 28 29 30 31 까지 왼쪽으로 뻗으며 첫 순회가 끝난다
즉 n - 1개씩 총 4가지 경우로 순회한다
한번 이 순회를 마치면
그 다음은 n - 3 개씩 순회를 하고
n - 2k 가 1일 될때 종료한다
이를 구현하는데, 한 순회가 끝날 때, 진행방향이 바뀌므로 배열의 index값을 조정해주어야 한다,
3. 이중배열과 target_num의 위치를 출력한다.
- 코드(출력)
n = int(input())
arr = [[0 for _ in range(n)] for _ in range(n)]
target = int(input()) # 5칸 밑으로 7칸 오른쪽으로 -> 배열로 표기하면 arr[4][6]
i = 0
j = 0
start = n ** 2
repeat = n - 1
cnt = 0
cnt2 = 0
while (start):
if start == target:
target_x, target_y = i, j
arr[i][j] = start
start -= 1
if cnt == 0:
i += 1
if repeat == 1:
cnt = 1
repeat = n - 1 - cnt2
continue
elif cnt == 1:
j += 1
if repeat == 1:
cnt = 2
repeat = n - 1 - cnt2
continue
elif cnt == 2:
i -= 1
if repeat == 1:
cnt = 3
repeat = n - 1 - cnt2
continue
elif cnt == 3:
j -= 1
if repeat == 1:
j += 1
i += 1
cnt = 0
cnt2 += 2
repeat = n - 1 - cnt2
continue
repeat -= 1
for i in range(n):
print(*arr[i])
print(target_x + 1, target_y + 1)
- 얻어갈 부분
1. 구현의 실수로 너무 많은 시간을 잡아먹었다. 다음에 구현할 때는 종이에 정확히 리스트를 써본 후 구현하자
'알고리즘(백준) > 구현' 카테고리의 다른 글
| [알고리즘/구현] 20291번 : 파일 정리 - python (1) | 2023.04.17 |
|---|---|
| [알고리즘/구현] 12933번 : 오리 - python (0) | 2023.04.16 |
| [알고리즘/구현] 20436번 : ZOAC 3 - python (1) | 2023.04.14 |
| [알고리즘/구현] 1244번 : 스위치 켜고 끄기 - python (0) | 2023.03.21 |
| [알고리즘/구현] 4396번 : 지뢰 찾기 - python (0) | 2023.03.20 |