
문제
문제설명
다음과 같이 n x n 크기의 격자에 1부터 n x n까지의 수가 하나씩 있습니다.
이때 수가 다음과 같은 순서대로 배치되어있다면 이것을 n-소용돌이 수라고 부릅니다.
소용돌이 수에서 1행 1열부터 n행 n열까지 대각선상에 존재하는 수들의 합을 구해야 합니다.
위의 예에서 대각선상에 존재하는 수의 합은 15입니다. 격자의 크기 n이 주어질 때 n-소용돌이 수의 대각선상에 존재하는 수들의 합을 reutrn 하도록 solution 함수를 완성해주세요.
매개변수 설명
격자의 크기 n이 solution 함수의 매개변수로 주어집니다.
- n은 1 이상 100 이하의 자연수입니다.
return 값 설명
n-소용돌이 수의 대각선상에 존재하는 수들의 합을 return 해주세요.
예시
n | return | |
예시 #1 | 3 | 15 |
예시 #2 | 2 | 4 |
예시설명
예시 #1
문제의 예와 같습니다.
예시 #2
1과 3을 더하여 4가 됩니다.
풀이
설명
소용돌이 수에서 1부터 n*n까지의 수가 채워지는 방향은 오른쪽, 아래쪽, 왼쪽, 위쪽 순으로 반복된다.
- 오른쪽 일 때, 행은 변화없고 열은 증가
- 아래쪽 일 때, 행은 증가하고 열은 변화 없음
- 왼쪽일 때, 행은 변화 없고 열은 감소
- 위쪽일 때, 행은 감소하고 열은 변호 없음
위처럼 방향에 따라 행과 열의 값이 변화하는 패턴을 파악했으니, 이 패턴을 각각 얼만큼 반복하는지를 알아보자.
n이 4일 때(문제에서 보여준 예시) 오른쪽 4번, 아래쪽 3번, 왼쪽 3번, 위쪽 2번, 다시 오른쪽 1번, 아래쪽 1번 반복한다.
이제 위의 규칙에 따라 변수를 설정해보자.
- 방향(dir)
: 먼저 오른쪽(0), 아래쪽(1), 왼쪽(2), 위쪽(3) 순으로 반복되는 방향을 저장할 변수 dir을 설정한다. 오른쪽부터 시작하므로 초기값을 0으로 주고, 0, 1, 2, 3이 반복되도록 할 것이다. - 반복 횟수(loop)
: 방향에 따라 행과 열의 값의 변화를 반복하는 횟수를 저장할 loop를 설정한다. 처음에는 오른쪽으로 n번 수가 채워지므로 초기값을 n을 준다. loop은 dir이 0과 2일 때 1씩 감소하므로 dir이 짝수일 때 감소하도록 할 것이다. - 행과 열의 변화값(dr, dc)
dir이 0, 1, 2, 3으로 변화함에 따른 행과 열의 변화값을 저장할 리스트를 만든다. dir을 인덱스 값으로 주면 방향에 따라 변화하는 행과 열의 값을 조회할 수 있다. - 행과 열의 초기값(r, c)
처음에는 오른쪽으로 시작하므로 행은 변화 없지만 열은 증가하기 때문에 초기 열 값은 -1로 준다.
풀이 코드
def solution(n):
answer = 0
a = [[0]*n for _ in range(n)] # n*n 리스트 생성
num = 0
dir = 0 # 0 1 2 3 0 ... 0:오른쪽 1: 아래쪽 2: 왼쪽 3: 위쪽
loop = n # 3 2 2 1 1 -> dir이 0과 2가 될 때 1씩 감소
dr = [0,1,0,-1] # row의 변량
dc = [1,0,-1,0] # col의 변량
r,c = 0, -1
while num < n*n:
for _ in range(loop):
r += dr[dir]
c += dc[dir]
num += 1
a[r][c] = num
dir += 1
if dir == 4: dir = 0
if dir % 2 != 0: loop -= 1
for i in range(n):
answer += a[i][i]
return answer
파이썬을 교양 수업으로 배우고 cos pro 2급을 딴 다음 cos pro 1급 도전해봤을 때 이 문제를 처음 접하고 나는 말하는 감자였구나 하고 절실히 느꼈다...
프로그래머스 level 2의 삼각 달팽이 문제가 이 문제와 비슷한 유형이라고 해서 풀어봤는데 이번에는 바로 풀려서 정말 짜릿했다. 삼각 달팽이 문제도 후에 포스팅할 예정이다.
'Coding Test' 카테고리의 다른 글
[프로그래머스] 삼각 달팽이 - Python3 (0) | 2022.09.28 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 - Python3 (0) | 2022.09.25 |
[프로그래머스] 키패드 누르기 - Python3 (1) | 2022.09.24 |
[프로그래머스] 숫자 문자열과 영단어 - Python3 (0) | 2022.09.24 |