swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


  • 시계방향으로 회전하면서 증가하는 숫자를 채우는 문제
  • 특정 패턴을 통한 반복문으로 푸는 방법보다, 재귀적으로 푸는 것이 당장에는 더 깔끔해 보인다.
  • 방향을 바꿔야 하는 타이밍만 정확하게 계산해서 바꿔주면 된다.

t = int(input())
dr = [0, 1, 0, -1]              # 4방향, 순서는 값의 증가방향인 오른쪽-아래-왼쪽-위쪽
dc = [1, 0, -1, 0]

def change(r, c, value, dir) :
    if value == n**2 :              # 전부 다 채웠으면 재귀 종료
        info[r][c] = value
        return
    if r + dr[dir] not in range(n) or c + dc[dir] not in range(n) :     # 다음 위치 인덱스가 범위를 벗어나거나
        dir += 1    
    elif info[r + dr[dir]][c + dc[dir]] != 0 :                          # 다음 위치가 이미 채워져있는 값이라면
        dir += 1                                                        # 방향을 다음 방향으로 틀고
    dir %= 4                                                            # 만약 위쪽이라면 다시 오른쪽으로 틀어줌
    info[r][c] = value                                                  # 현재 위치에 값을 채우고
    r += dr[dir]
    c += dc[dir]                                                        # 다음 위치로 이동
    change(r, c, value + 1, dir)                                        # 다음 위치의 값 채우는 재귀호출

for tc in range(t) :
    n = int(input())
    print("#" + str(tc+1))
    info = [[0 for i in range(n)] for j in range(n)]        # 2차원 리스트, 0으로 초기화
    change(0, 0, 1, 0)                                      # 재귀호출 시작
    for r in range(n) :                                     # 정답 출력
        for c in range(n) :
            print(info[r][c], end = " ")
        print()

'PS > SWEA' 카테고리의 다른 글

[SWEA] 1284.cpp : 수도 요금 경쟁  (0) 2020.08.31
[SWEA] 1204.cpp : 최빈수 구하기  (0) 2020.08.30
[SWEA] 1974.py : 스도쿠 검증  (0) 2020.07.23
[SWEA] 1989.py : 초심자의 회문 검사  (0) 2020.07.15
[SWEA] 2001.py : 파리 퇴치  (0) 2020.07.14

+ Recent posts