본문 바로가기

알고리즘/백준

[백준] 1022번 : 소용돌이 예쁘게 출력하기

728x90

1022번: 소용돌이 예쁘게 출력하기

 

1022번: 소용돌이 예쁘게 출력하기

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

www.acmicpc.net

🤔 문제분석

회전하는 로직을 구현하는것이 이문제의 핵심이다. 회전은 아래의 사진과 같이 이루어진다.

i가 (2, 3, 4, 5 … ) 1씩 증가하면서 두번씩 (좌 or 우), (상 or 하) 움직인다. 그것을 방향은 방향을 다움직이고나서 다음 방향으로 전환 시켜주면 된다.

회전 구현이 다 끝났다면 이제 문제에 조건이 맞는 길이를 맞추어주면 끝

💻 코드

import sys

input = sys.stdin.readline

r1, c1, r2, c2 = map(int, input().split())
R = r2 - r1 + 1
C = c2 - c1 + 1

fill_cnt = R*C

table = [[0 for _ in range(C)] for _ in range(R)]

moves = [(0, 1), (-1, 0), (0, -1), (1, 0)] # right, up, left, down

def chage_dir(dir):
    if dir == 3:
        return 0
    else:
        return dir + 1
    
y = - r1
x = - c1
i = 1
cnt = 1
dir = 0
max_length = 0
while fill_cnt > 0:
    for _ in range(2):
        for _ in range(i):
            if R > y >=0 and C > x >=0:
                max_length = len(str(cnt))
                table[y][x] = str(cnt)
                fill_cnt -= 1
            
            y += moves[dir][0]
            x += moves[dir][1]
            cnt += 1
        
        dir = chage_dir(dir)
    
    i += 1
    
for i in range(R):
    for j in range(C):
        length = len(table[i][j])
        if max_length > length:
            table[i][j] = ' '*(max_length-length) + table[i][j]

for t in table:
    print(*t)

🎯 피드백 및 개선사항

회전을 구현하는것만 잘하면 어렵지 않은 문제입니다.

728x90