티스토리 뷰

문제출처 - https://swexpertacademy.com/main/code/problem/problemDetail.do

 

SW Expert Academy

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

swexpertacademy.com

(로그인 해야 문제를 볼 수 있어요!)

 

내 풀이

t = int(input())

for a in range(t):
    n = int(input())
    direction = 0  # Right=0 Down=1 Left=2 Up=3
    right, down, left, up = 0, n-1, n-1, 0
    row, column = 0, 0
    arr = [[0]*n for _ in range(n)]
    num = 1

    while num <= n ** 2:

        if direction is 0:  # 오른쪽
            if right >= n: continue
            for i in range(n):
                if arr[right][i] != 0:
                    continue
                arr[right][i] = num
                num += 1
            right += 1
            direction = 1
        elif direction is 1:  # 아래
            if down >= n: continue
            for i in range(n):
                if arr[i][down] != 0:
                    continue
                arr[i][down] = num
                num += 1
            down -= 1
            direction = 2
        elif direction is 2:  # 왼쪽
            if left < 0: continue
            for i in range(n-1, -1, -1):
                if arr[left][i] != 0:
                    continue
                arr[left][i] = num
                num += 1
            left -= 1
            direction = 3
        elif direction is 3:  # 위
            if up < 0: continue
            for i in range(n-1, -1, -1):
                if arr[i][up] != 0:
                    continue
                arr[i][up] = num
                num += 1
            up += 1
            direction = 0

    # 출력
    print("#%d" % (a+1))
    for line in arr:
        print(' '.join(map(str, line)))

설명

 

딱히 설명이랄것 없이 방향을 4개로 나눠서 조잡하게 풀었다. 그래서 방향 한개한개의 for문 증감문이나 배열의 idx에 넣어야 하는 값들을 지정하는게 굉장히 헷갈렸다..

 

 

직관적인 다른 풀이

t = int(input())

for a in range(t):
    n = int(input())
    arr = [[0]*n for _ in range(n)]
    num = 0
    direction = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    directionIdx = 0
    curX, curY = 0, -1

    while num < n * n:
        tmpX = curX + direction[directionIdx][0]
        tmpY = curY + direction[directionIdx][1]

        # 범위 초과시 방향 바꿔줌
        if tmpX < 0 or tmpY < 0 or tmpX >= n or tmpY >= n or arr[tmpX][tmpY] != 0:
            directionIdx += 1
            if directionIdx == 4:
                directionIdx = 0
        else:
            num += 1
            curX, curY = tmpX, tmpY
            arr[curX][curY] = num


    # 출력
    print("#%d" % (a+1))
    for line in arr:
        print(' '.join(map(str, line)))

분석

 

direction 리스트를 만들어서 오른쪽->아래->왼쪽->위 방향으로 방향을 바꾸게 해준다. 

 

만약 direction을 [(0, 1), (0, -1), (1, 0), (-1, 0)] 이렇게 해주면 오른쪽->왼쪽->위쪽->아래쪽으로 방향을 바꾸게 돼서 위 코드에 있는대로 할당을 해줘야 한다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함