https://www.acmicpc.net/problem/1022
1022번: 소용돌이 예쁘게 출력하기
첫째 줄에 네 정수 r1, c1, r2, c2가 주어진다.
www.acmicpc.net
백준 - 소용돌이 예쁘게 출력하기 (1022번)
난이도 : Gold 3
알고리즘&자료구조 : Simulation & Implementation (구현)
시간복잡도 (Time Complexity) : O( (r2-r1+1) * (c2-c1+1) )
★ 핵심 Idea ★
◎ 각 정사각형의 왼쪽 아래 꼭지점은, [(2 * 해당 좌표) + 1] ^ 2 가 된다.
ex) (3, 3) 좌표 → [(2 * 3) + 1] ^ 2 = 7 ^ 2 = 49
현재 좌표가 어느 정사각형에 속해있는지, 행과 열 값중 더 큰 값을 통해 확인하고,
왼쪽 아래 꼭지점을 기준으로부터 거리를 계산하면
해당 좌표의 값을 구할 수 있다.
< 전체 코드 >
import sys
input = sys.stdin.readline
def _calc(r, c):
is_r = True if abs(c) <= abs(r) else False
maxy = max(abs(r), abs(c))
edge = ((maxy<<1)+1)**2
if is_r:
if r > 0:
return edge - (maxy-c)
return edge - (maxy<<2) - (maxy+c)
else:
if c > 0:
return edge - 3*(maxy<<1) - (maxy+r)
return edge - (maxy<<1) - (maxy-r)
class Swirl():
def __init__(self, r1, c1, r2, c2):
values = [[0] * (c2-c1+1) for _ in range(r2-r1+1)]
for i, r in enumerate(range(r1, r2+1)):
for j, c in enumerate(range(c1, c2+1)):
values[i][j] = _calc(r, c)
maxy = max(max(row) for row in values)
maxy_len = len(str(maxy))
self.values = '\n'.join(' '.join(map(lambda x: str(x).rjust(maxy_len, ' '), row)) for row in values)
if __name__ == '__main__':
board = Swirl(*map(int, input().split()))
print(board.values)
'Algorithm' 카테고리의 다른 글
폭탄 던지는 태영이 (20543번) - 백준 (BOJ) (0) | 2023.09.13 |
---|---|
인터넷 설치 (1800번) - 백준 (BOJ) (0) | 2023.09.12 |
용이 산다 (3430번) - 백준 (BOJ) (0) | 2023.09.10 |
문자판 (2186번) - 백준 (BOJ) (0) | 2023.09.09 |
비드맨 (19590번) - 백준 (BOJ) (0) | 2023.09.07 |