본문 바로가기

Certificate/Cos Pro 1급 (Python)

[Cos Pro 1급] 기출문제 1회차, 소용돌이 수

Hi, There!
안녕하세요, 바오밥입니다.


목차

  1. 문제
  2. 풀이

문제

문제 설명

다음과 같이 n x n 크기의 격자에 1부터 n x n까지의 수가 하나씩 있습니다.

이때 수가 다음과 같은 순서로 배치되어있다면 이것을 n-소용돌이 수라고 부릅니다.

 

소용돌이 수에서 1행 1열부터 n 행 n 열까지 대각선상에 존재하는 수들의 합을 구해야 합니다.

위의 예에서 대각선상에 존재하는 수의 합은 15입니다. 격자의 크기 n이 주어질 때 n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 하도록 solution 함수를 완성해주세요.

 

매개변수 설명

  • 격자의 크기 n이 solution 함수의 매개변수로 주어집니다.
  • n은 1 이상 100 이하의 자연수입니다.

 

return 값 설명

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

 

예시

예시 설명

  • 예시 #1 : 문제의 예와 같습니다.
  • 예시 #2 : 1과 3을 더하여 4가 됩니다.

풀이

풀이 코드 및 해설

def solution(n):
    a = [ [0]* n for _ in range(n)] # [0]으로 가득찬 2차원 리스트 생성
    dir = 0 # 방향 0 1 2 3 0 1 2 3 ...
    loop = n # 해당 방향으로 채우는 숫자 개수
    r, c = 0, -1  # 좌표의 초기값
    dr = [0, 1, 0, -1]  # 방향에 대한 r의 변량
    dc = [1, 0, -1, 0]  # 방향에 대한 c의 변량
    num = 0
    while num < n*n : # (n*n) 크기의 2차원 배열이 꽉 찰 때까지 진행
        for _ in range(loop): # n번만큼 반복
            r += dr[dir] # row 값을 누적함, dr[dir] => 0, 1, 0, -1를 순차적으로 누적함
            c += dc[dir] # 위와 동일한 원리임
            num += 1 # 배열의 요소 값을 카운트
            a[r][c] = num # 누적된 r 값과 c 값을 2차우너 리스트의 위치로 사용함 => 그 후, num을 누적함
        dir = (dir + 1) % 4 # 방향 값이 3=>4로 변함 => 3이 되기 전까지는 0,1,2을 반환
        if dir % 2 : loop -= 1 # 소용돌이 수는 2번씩 동일한 값으로 반복하며 요소를 추가함
                               # 즉, loop를 1인 경우 1번 감소 3인 경우 1번 감소
                               # 총 4번 반복 중에 loop 값이 2만큼 감소
    answer = 0
    for x in range(n):
        answer += a[x][x] # 대각선은 항상 row와 col 값이 동일함 => answer[x][x]에 접근하여 값 누적
    return answer