문제주소 : 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 함수를 완성해주세요.
![](https://blog.kakaocdn.net/dn/x40fH/btqUfZ0jS1L/yN9g6wDwZ3opNXLmv9qU1k/img.png)
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예
n result4 | [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
- 문제 예시와 같습니다.
<풀이법>
▒ 한줄 개념: 조건 ▒
굉장히 노가다성이 짙은 문제였다고 생각이 듭니다. 여태까지의 문제들에 비해 규칙이 조금 더 복잡하게 사용된 것 같습니다. 어떤 하나의 규칙을 찾아 딱 하고 풀어내기엔 조건을 나눠야하는 것이 많다고 생각이 들었습니다.
그에 따라 조건을 위한 변수 사용도 다양했습니다.
풀이 방식은 다음과 같습니다.
1. 삼각형마다 달팽이 한마리
삼격형마다 한바퀴씩을 한번의 반복으로 두었습니다. 다음과 같은 n=6 삼각형의 경우, 총 2번의 큰 반복이 필요합니다.
하나의 삼각형에 대해 한 바퀴를 돌고, 작은 내부 삼각형에 대해 한 바퀴를 또 돌게 됩니다.
2. 한 바퀴를 세 부분으로 나누기
삼각형에 대한 한 바퀴가 다음과 같이 3가지 경우로 나뉘어집니다.
내려가면서 한번, 맨 밑에서 한번, 올라오면서 한번.
3. 삼각형에 따른(1번 조건) 3가지 부분을 나누기 위한(2번 조건) 여러가지 변수들
s
: 1번 조건을 보면 삼각형이 점점 작아집니다. 이 삼각형의 사이즈를 정해주기 위한 조건이 s
입니다.
d
: 1번 조건에서 다음 삼각형의 시작위치를 잡아주기 위한 변수 d
입니다.
b
: 1번 조건에서 다음 삼각형에 대해, 2번 조건의 3가지 경우에 대한 위치를 잡아주기 위한 변수b
입니다.
<코드(Python)>
from functools import reduce
def solution(n):
answer = []
total_count = int(n * (n + 1) / 2) # 전체 숫자의 수
for i in range(1,n+1): # 미리 전체 배열 만들어주기. 넣기 편하게
block =[]
for j in range(i):
block.append(0)
answer.append(block)
t = 1
s = n
b = 0
d = 0
while True: # 큰 반복. 조건 1
for i in range(s): # 조건 2-1
answer[i+d][0+b] = t
t += 1
if t == total_count+1:
return list(reduce(lambda x,y:x+y, answer))
for i in range(1, s): # 조건 2-2
answer[-1-b][i+b] = t
t += 1
if t == total_count+1:
return list(reduce(lambda x,y:x+y, answer))
for i in range(s-2, 0, -1): # 조건 2-3
answer[i+d][-1-b] = t
t += 1
if t == total_count+1:
return list(reduce(lambda x,y:x+y, answer))
s -= 3
b += 1
d += 2
return list(reduce(lambda x,y:x+y, answer))
여러모로 코드가 지저분해 보인다는 생각이 드네요. 나중에 다시 풀어봐야 할 것 같은 문제입니다.
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
'Programmers' 카테고리의 다른 글
[프로그래머스] 타겟 넘버 / Python (2) | 2021.01.21 |
---|---|
[프로그래머스] 피보나치 수 / Python (0) | 2021.01.21 |
[프로그래머스] 행렬의 곱셈 / Python (0) | 2021.01.20 |
[프로그래머스] 예상 대진표 / Python (0) | 2021.01.20 |
[프로그래머스] 땅따먹기 / Python / 반례 포함 (0) | 2021.01.20 |