[COS Pro 1급 Python] 1차 기출문제 5) 소용돌이 수

정은·2023년 7월 26일

COS Pro 1급

목록 보기
6/26
post-thumbnail

문제 5)

다음과 같이 n x n 크기의 격자에 1부터 n x n까지의 수가 하나씩 있습니다.
image
이때 수가 다음과 같은 순서로 배치되어있다면 이것을 n-소용돌이 수라고 부릅니다.
image
소용돌이 수에서 1행 1열부터 n 행 n 열까지 대각선상에 존재하는 수들의 합을 구해야 합니다.
image
위의 예에서 대각선상에 존재하는 수의 합은 15입니다.
격자의 크기 n이 주어질 때 n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 하도록 solution 함수를 완성해주세요.


매개변수 설명

격자의 크기 n이 solution 함수의 매개변수로 주어집니다.

  • n은 1 이상 100 이하의 자연수입니다.

return 값 설명

n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 해주세요.


예시
nreturn
315
24
예시 설명

예시 #1
문제의 예와 같습니다.

예시 #2
image
1과 3을 더하여 4가 됩니다.

주어진 문제 5) 코드

#You may use import as below.
#import math

def solution(n):
    # Write code here.
    answer = 0
    return answer


#The following is code to output testcase.
n1 = 3
ret1 = solution(n1)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret1, ".")
    
n2 = 2
ret2 = solution(n2)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret2, ".")

Solution

주어진 문제 5) Solution 코드

이번에도 빈칸 채우기 문제가 아니라 함수 전체를 작성하는 문제이다.

#You may use import as below.
#import math

def solution(n):
    # Write code here.
    answer = 0
    matrix = [[0 for _ in range(n)] for _ in range(n)]

    i, j = 0, 0
    value = 1
    state = "right"
    while matrix[i][j] == 0:
        matrix[i][j] = value
        value += 1

        if state == "right":
            if j + 1 < n and matrix[i][j+1] == 0:
                j += 1
            elif j + 1 >= n or  matrix[i][j+1] > 0:
                i += 1
                state = "down"
            
        elif state == "down":
            if i + 1 < n and matrix[i+1][j] == 0:
                i += 1
            elif i + 1 >= n or matrix[i+1][j] > 0:
                j -= 1
                state = "left"

        elif state == "left":
            if j - 1 >= 0 and matrix[i][j-1] == 0:
                j -= 1
            elif j - 1 >= 0 or matrix[i][j-1] > 0:
                i -= 1
                state = "up"
                
        elif state == "up":
            if i - 1 >= 0 and matrix[i-1][j] == 0:
                i -= 1
            elif i - 1 >= 0 or matrix[i-1][j] == 0:
                j += 1
                state = "right"
        
    for i in range(n):
        answer += matrix[i][i]
    return answer


#The following is code to output testcase.
n1 = 3
ret1 = solution(n1)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret1, ".")
    
n2 = 2
ret2 = solution(n2)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret2, ".")

정답 풀이 방식 (참고)

#You may use import as below.
#import math

def solution(n):
    # Write code here.
    answer = 0
    pane = [[0] * n for _ in range(n)] # 1. 2차원 리스트를 초기화

    # 2. 소용돌이 방향으로 움직이기 위한 좌표 변화 규칙을 리스트로 설정
    di = [0, 1, 0, -1]
    dj = [1, 0, -1, 0]

    ci, cj = 0, 0 # 3. 현재 위치를 (0,0) 으로 설정
    num = 1 # 4. 숫자를 1부터 입력
    k = 0 # 5. 좌표 변화 규칙 리스트의 인덱스 초기화

    # 6. 좌표가 범위 안에 있고 현재 위치의 값이 0인 동안 반복
    while 0 <= ci < n and 0 <= cj <n and pane[ci][cj] == 0:
        pane[ci][cj] = num
        num += 1

        # 7. 소용돌이 변화 규칙[k]에 맞게 위치를 바꾸면서 숫자 값을 1씩 증가하며 입력.
        next_i = ci + di[k]
        next_j = cj + dj[k]

        #8.(다음 입력 좌표가 범위를 벗어났거나) or (다음 위치의 값이 0이 아닌 경우) : 방향 바꿈
        if next_i == -1 or next_i == n or next_j == -1 or next_j == n or pane[next_i][next_j] > 0:
            k = (k + 1) % 4

        ci += di[k]
        cj += dj[k]

    for i in range(n):
        answer += pane[i][i]
        
    return answer


#The following is code to output testcase.
n1 = 3
ret1 = solution(n1)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret1, ".")
    
n2 = 2
ret2 = solution(n2)

#Press Run button to receive output. 
print("Solution: return value of the function is", ret2, ".")

profile
정니의 이런거 저런거 기록 일지 😛

0개의 댓글