반응형
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
n은 1 이상 1,000 이하입니다.
입출력 예
n result
4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]
입출력 예 설명
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
문제 예시와 같습니다.
입출력 예 #3
문제 예시와 같습니다.
def solution(n):
answer = []
array = [[0] * n for _ in range(n)]
x, y = -1, 0 # 처음엔 무조건 아래로 향하게 해야 하므로 x=-1로 초기화
num = 1
for i in range(n): # 방향 check
for _ in range(i, n):
if i % 3 == 0: # 아래
x += 1
elif i % 3 == 1: # 오른쪽
y += 1
elif i % 3 == 2: # 위쪽 대각선
x -= 1
y -= 1
array[x][y] = num
num += 1
for i in array:
for j in i:
if j:
answer.append(j)
return answer
해당 문제는 수학적인 감각이 필요한 문제로 참고 코드를 봐도 한참을 이해하지 못했다. 일단, 문제 제목은 "삼각 달팽이"지만 삼각형에서 벗어나 사각형으로 생각해보자. n=4 일 때로 예를 들어본다.
위 사각형의 초기화 버전이 array 라는 변수다. 방향을 생각해보면 일단 1, 2, 3, 4 까지 1) 아래를 향한다. 그리고 4, 5, 6, 7 을 보듯이 2) 오른쪽을 향한다. 마지막으로 7, 8, 9 를 보면 3) 위쪽(엄밀히 말하면 위쪽 대각선)을 향한다. 방향은 크게 이렇게 3가지가 존재한다.
이후 9, 10은 방향 1번이고, n=5, n=6 일 때 예시를 보면 이렇게 삼각형 모양을 이루는 방향 변화가 반복되는 것을 알 수 있다. 이 모양이 달팽이를 의미한다.
문제에서 주어진 n번 동안 for 반복문을 돌리며 방향을 확인한다. 밑변의 길이와 높이가 n이기 때문에 반복문 안에 또 하나의 반복문을 추가한다. 숫자가 1씩 증가하면서 끝변까지 다다르면 방향 전환이 된다. range() 에서 n은 변하지 않지만 바깥쪽의 for 반복문에서 방향 전환이 될 때 i가 1씩 증가하기 때문에 각 상황에서의 "끝변"이 정해지게 된다.
이와 같은 문제는 실제 그림을 그려가며 코드를 이해하는 것이 좋다. 관건은 이런 문제가 출제되었을 때 어떻게 그려가며 풀 것인가인데... 수학적 감각을 요구하는 문제에는 힘을 못쓴다 ㅠ
728x90
반응형
'문돌이 존버 > 프로그래밍 스터디' 카테고리의 다른 글
(프로그래머스 연습 문제 풀이) 스킬트리 (0) | 2021.09.05 |
---|---|
(프로그래머스 연습 문제 풀이) 모음 사전 (0) | 2021.08.31 |
(leetcode 문제 풀이) Min Stack (0) | 2021.07.29 |
(leetcode 문제 풀이) Linked List Cycle (0) | 2021.07.28 |
(프로그래머스 연습 문제 풀이) 오픈채팅방 (0) | 2021.07.26 |