Post

[백준] 1022 파이썬

문제


  • 백준 1022 (골드 3)

백준 1022

정수의 소용돌이 중 일부를 적절하게 출력하는 문제였다.
출력에서 만약 수의 길이가 가장 길이가 긴 수보다 작다면, 왼쪽에서부터 공백을 삽입해 길이를 맞추어야 한다는 조건이 있었다.

image

내 코드


수학적인 접근을 통해서 문제를 해결하지 않으면 시간 초과가 날 것 같아서 수학적인 방식으로 접근해 보았다.
생각해내기 쉽지 않았지만 (r, c)중 최대값을 통해서 해당 좌표의 값을 알아낼 수 있겠다는 생각이 들어 해당 방식으로 구현해 보았다.
출력을 어떤 방식으로 해야할지 몰랐는데 구글링을 통해서 %*d를 활용하면 원하는 방식으로 출력이 가능하다는 것을 알게 되어서 활용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import sys
input = sys.stdin.readline

r1, c1, r2, c2 = map(int, input().split())

def cal(x, y):
    m = max(abs(x), abs(y))
    s = (m * 2 + 1) ** 2 
    if m == 0:
        return 1
    
    if x == m:
        return (s + (y - m))
    if y == -1 * m:
        return (s - m * 2 + (x - m))
    if x == -1 * m:
        return (s - m * 4 - (y + m))
    if y == m:
        return (s - m * 6 - (x + m))
    
max_len = 0
len = 0
for i in range(r1, r2 + 1):
    for j in range(c1, c2 + 1):
        max_len = max(max_len, cal(i, j))

while max_len > 0:
    len += 1
    max_len //= 10


for i in range(r1, r2 + 1):
    for j in range(c1, c2 + 1):
        print("%*d" %(len, cal(i, j)), end = " ")
    print()

image

This post is licensed under CC BY 4.0 by the author.