Algorithm
[python][프로그래머스] 삼각달팽이
chief
2022. 6. 22. 22:10
반응형
🚀 들어가며...
- '레벨 2'의 문제입니다.
🔗 문제
https://programmers.co.kr/learn/courses/30/lessons/68645
코딩테스트 연습 - 삼각 달팽이
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]
programmers.co.kr
📑 내용
[ 문제 설명 ]
정수 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] |
🔗 풀이
- 삼각 달팽이를 저장할 res와 res의 인덱스에 접근하기위한 x, y값을 각각 -1, 0 (x = -1, y = 0) 으로 초기화 시켜줍니다.
x를 -1로 초기화시켜주는 이유는 이후 이중 for문 사용 시 초기에 x값을 0으로 시작할수 있도록 하기 위함이며,
소스를 보시면 이해하실수 있으실겁니다. - res에 저장할 수 num을 선언 및 초기화 합니다.
- 예를 들어 n이 4라고 한다면, 이중 for문으로 한변을 지날때마다 4개 -> 3개 -> 2개 -> 1개로 저장할 수가 적어지니
0~n 까지, i~n 까지의 이중 for문을 작성합니다. - i 를 %연산자를 이용하여 3단계로 구분하여,
i % 3 == 0이면 down
i % 3 == 1이면 right
i % 3 == 2이면 up - 알맞은 인덱스에 num을 1씩 늘리며 저장하면 res에 삼각 달팽이가 저장됩니다.
- 이중 for문으로 answer에 기존의 2차원 리스트를 하나로 합쳐주면 끝 입니다.
💌 소스코드
def solution(n):
res = [[0] * n for _ in range(n)] # 모두 0으로 개수만큼 세팅
answer = []
x, y = -1, 0 # for문 실행시 x값을 처음에 0으로 세팅해주기 위해 초기값은 -1로 세팅
num = 1 # 들어갈 숫자
for i in range(n):
for j in range(i, n):
# down
if i % 3 == 0: # 3으로 퍼센트연산해준 이유는 down/right/up 세 동작이기 때문
x += 1
# right
elif i % 3 == 1:
y += 1
# up
elif i % 3 == 2:
x -= 1
y -= 1
res[x][y] = num # res에 저장
num += 1
for i in res:
for j in i:
if j != 0:
answer.append(j) # 저장했던 배열 for문이용 합쳐줍니다.
return answer
🙋🏻♂️ 후기
문제의 내용자체는 적은편이었으나 레벨2 난이도답게 구현난이도가 높았다고 생각합니다.
풀이의 핵심은 글자에 노란색 배경을 넣은 부분, 즉 초기화 및 이중포문 이용, %연산자를 이용하여 3단계로 구분하는 부분이며 위 문제 풀이시에는 손으로 그림을 그려가면서 푸시면 좀 더 구현방법이 쉽게 떠오르실 것이라고 생각듭니다
반응형