본문 바로가기

코딩테스트/SWEA

[Python, 파이썬] SWEA 1954. 달팽이 숫자

 

# 달팽이 만들기
def makeSnail(N):

    global snail
    global num

    sx = sy = 0
    ex = ey = N-1


    for _ in range((N-1) // 2):
        
        Go(sx, sy, ey+1) # 오른쪽(열 증가)
        Down(ey, sx+1, ex) # 아래(행 증가)
        Back(ex, ey, sy-1) # 왼쪽(열 감소)
        UP(sy, ex-1, sx) #위(행 감소)

        sx, sy, ex, ey = sx + 1, sy + 1, ex - 1, ey - 1 # 변수 업데이트

    # N이 홀수일 때
    if(N%2==1):
        snail[sx][sy] = num
        return

    # N이 짝수일 때
    Go(sx, sy, ey+1) # 오른쪽(열 증가)
    Back(ex, ey, sy-1) # 왼쪽(열 감소)


# 오른쪽(열 증가)
def Go(x, start, end):

    global num
    
    for i in range(start, end):
            snail[x][i] = num
            num += 1

# 아래(행 증가)
def Down(y, start, end):
    
    global num
    
    for i in range(start, end):
            snail[i][y] = num
            num += 1

# 왼쪽(열 감소)
def Back(x, start, end):
    
    global num
    
    for i in range(start, end, -1):
            snail[x][i] = num
            num += 1

#위(행 감소)
def UP(y, start, end):

    global num
    
    for i in range(start, end, -1):
            snail[i][y] = num
            num += 1

# 달팽이 그리기
def draw(i, snail):
    print("#%d" %(i))

    for line in snail:
        for x in line:
            print(x, end=' ')
        print()

T = int(input()) # 테스트 케이스의 수 T

for test_case in range(1, T+1):
    N = int(input()) # 달팽이의 크기 N
    snail = [[0 for i in range(N)] for j in range(N)] # 빈 달팽이
    num = 1

    makeSnail(N) # 달팽이 만들기
    draw(test_case, snail) # 달팽이 그리기
 

 

 

[문제풀이]


  • Go : 오른쪽(열 증가)
  • Down : 아래(행 증가)
  • Back : 왼쪽(열 감소)
  • Up : 위(행 감소)

 

달팽이란 위처럼 4단계로 이루어져 있다.

이걸 함수로 만들어서 바깥쪽부터 안쪽으로 각 단계를 밟아 채워나가는 방식을 (N-1) // 2번 반복!

 

그럼 짝수일 때는 오른쪽(열 증가)랑 왼쪽(열 감소)가 남고,

홀수일 때는 딱 하나가 남는다.

 

마지막 남은 거까지 반복해주면 달팽이를 그릴 수 있다.