문제

문제설명

다음과 같이 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의 삼각 달팽이 문제가 이 문제와 비슷한 유형이라고 해서 풀어봤는데 이번에는 바로 풀려서 정말 짜릿했다. 삼각 달팽이 문제도 후에 포스팅할 예정이다.

복사했습니다!