백준 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()
'알고리즘 문제 풀이 > 항해99 코테 스터디' 카테고리의 다른 글
[99클럽/파이썬 챌린저/21일차] 우주 탐사선 (0) | 2024.11.17 |
---|---|
[99클럽/파이썬 챌린저/20일차] 소트 (0) | 2024.11.16 |
[99클럽/파이썬 챌린저/18일차] 상담원 인원 (0) | 2024.11.14 |
[99클럽/파이썬 챌린저/17일차] 작업 (0) | 2024.11.13 |
[99클럽/파이썬 챌린저/16일차] 비슷한 단어 (0) | 2024.11.13 |