본문 바로가기
PS

[BOJ] Python 백준 소용돌이 예쁘게 출력하기(1022)

by 1223v 2025. 2. 5.

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 이런식으로 빼주고 넣어줘야 배열 나열이 잘 되는데 이점을 생각치못했다...

댓글