알고리즘 문제 풀이/항해99 코테 스터디

[99클럽/파이썬 챌린저/19일차] 소용돌이 예쁘게 출력하기

제유찬 2024. 11. 16. 03:41

백준 1022번 소용돌이 예쁘게 출력하기 G3

 

문제
크기가 무한인 정사각형 모눈종이가 있다. 모눈종이의 각 정사각형은 행과 열의 쌍으로 표현할 수 있다. 이 모눈종이 전체를 양의 정수의 소용돌이 모양으로 채울 것이다. 일단 숫자 1을 0행 0열에 쓴다. 그러고 나서 0행 1열에 숫자 2를 쓴다. 거기서부터 소용돌이는 반시계 방향으로 시작된다. 
이 문제는 위와 같이 채운 것을 예쁘게 출력하면 된다. r1, c1, r2, c2가 입력으로 주어진다. r1, c1은 가장 왼쪽 위 칸이고, r2, c2는 가장 오른쪽 아래 칸이다. 예쁘게 출력한다는 것은 다음과 같이 출력하는 것이다. 출력은 r1행부터 r2행까지 차례대로 출력한다. 각 원소는 공백으로 구분한다. 모든 행은 같은 길이를 가져야 한다. 공백의 길이는 최소로 해야 한다. 모든 숫자의 길이(앞에 붙는 공백을 포함)는 같아야 한다. 만약 수의 길이가 가장 길이가 긴 수보다 작다면, 왼쪽에서부터 공백을 삽입해 길이를 맞춘다.

입력
첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.

출력
r2 - r1 + 1개의 줄에 소용돌이를 예쁘게 출력한다.

 

 

 

소용돌이 구하는 곳에서 애를 먹어, 다른 사람의 풀이를 참고하여 풀이하였다.

범위 내의 숫자만 담아 메모리 초과를 방지했다.

 

최대 숫자를 기준으로 길이를 구해서 각 숫자의 길이의 차만큼 추가로  띄어쓰기하여 출력하였다.

 

 

더보기
import heapq
import sys
from collections import deque

r1, c1, r2, c2 = map(int, sys.stdin.readline().split())

maps = [[0] * (c2-c1+1) for _ in range(r2-r1+1)]

cnt = (c2-c1+1) * (r2-r1+1)


dy = [-1, 0, 1, 0]
dx = [0, 1, 0, -1]
d = 1
length = 1
y, x = 0, 0
num = 1
while cnt > 0:
    for same_len in range(2):
        for _ in range(length):
            if c1<=x<=c2 and r1<=y<=r2:
                cnt -= 1
                maps[y-r1][x-c1] = num
            num += 1
            y, x = y+dy[d], x+dx[d]
        d = (d-1)%4
    length += 1

fit_max = 0
for i in range(r2-r1+1): fit_max = max(fit_max, max(maps[i]))

fit_max = len(str(fit_max))

for data in maps:
    for val in data:
        print(" " * (fit_max - len(str(val))) + str(val), end=" ")
    print()