본문 바로가기

Algorithm

소용돌이 예쁘게 출력하기 (1022번) - 백준 (BOJ)

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)