https://www.acmicpc.net/problem/1022
달팽이 구현 문제이다.
우선 (r2-r1+1) * (c2-c1+1) 배열을 만들어주고, 그 배열이 다 채워질때까지 달팽이 코드를 돌리면 된다.
달팽이 코드
상하 중 하나 양옆중 하나를 움직이고 length가 늘어나는 특징을 지닌다.
즉, 2번은 움직임이 같고 이후 한개씩 늘린다.
그 과정에서 같은 길이를 2번 방향이 달리하게 움직여줘야 하니 한번 length 만큼 루프를 돌고 방향전환 후 한번더 루프를 돈다.
length 루프 내부는 계속 ni, nj 값을 계속 증가시키며 움직여주고, 만약, (r2-r1+1) * (c2-c1+1) 이 배열 내부를 지나간다면, 정답배열에 cnt 값을 갱신해준다.
출력
이후, cnt의 값이 정답배열에 최종적으로 입력된 값의 길이가 얼마나 되는지를 계산하고, 이가 부족한 값들은 .rjust(필요한 길이 (m)) 만큼 증가시키면서 출력하면 된다.
import sys
input = sys.stdin.readline
r1,c1,r2,c2 = map(int,input().split())
graph = [[0] * (c2-c1+1) for _ in range(r2-r1+1)]
total = (r2-r1+1) * (c2-c1+1)
di = [0,-1,0,1]
dj = [1,0,-1,0]
cnt = 1
ni,nj = 0,0
length = 1
direction = 0
while total >0:
for _ in range(2):
for _ in range(length):
if r1 <= ni <= r2 and c1 <= nj <= c2:
graph[ni-r1][nj-c1] = cnt
total -= 1
m = cnt
ni += di[direction]
nj += dj[direction]
cnt += 1
direction = (direction + 1) % 4
length += 1
m_len = len(str(m))
for i in range(r2-r1+1):
for j in range(c2-c1+1):
print(str(graph[i][j]).rjust(m_len), end=' ')
print()
회고,
공백을 어떻게 채울지 몰랐고, r1 <= ni <= r2 and c1 <= nj <= c2 범위 내에 들어왔을때, 그 부분에서 graph[ni-r1][nj-c1] = cnt 이런식으로 빼주고 넣어줘야 배열 나열이 잘 되는데 이점을 생각치못했다...
'PS' 카테고리의 다른 글
[Programmers] Python 프로그래머스 스타 수열(70130) (0) | 2025.02.06 |
---|---|
[BOJ] Python, Ruby 백준 N-Queen(9663) (0) | 2025.02.04 |
[BOJ] Ruby 백준 게똥벌레(3020) (0) | 2025.02.02 |
[BOJ] Python, Ruby 백준 빙산(2573) (0) | 2025.02.02 |
[Programmers] Python 프로그래머스 양과 늑대(92343) (0) | 2025.01.22 |
댓글