코딩테스트

[프로그래머스] 삼각 달팽이 - 파이썬

swedu 2023. 1. 18. 06:23
728x90
반응형

2023.1.18. 최초 작성

 

 

Lv2.

출처 :

https://school.programmers.co.kr/learn/courses/30/lessons/68645?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

 

[그림1] 완성된 삼각 달팽이

 

제한사항

n1 이상 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

 

문제 예시와 같습니다.

 

 


 

[문제분석]

삼각 달팽이의 가장 바깥쪽 테두리를 시계 반대 방향으로 돌면서 숫자가 증가하는 형태이다.

바깥쪽 테두리 다음에는 안쪽 테두리도 같은 방식이다. 삼각 달팽이가 커질수록 계속 안쪽 테두리가 추가된다.

[그림2] 삼각 댈팽이의 숫자 테두리

 

 

[접근 방법]

삼각 달팽이의 테두리는 1부터 1씩 증가하는 값을 가지므로 계산이 간단하지만, 반복 구조 만들기가 어렵다.

왼쪽에서 오른쪽으로, 위에서 아래로 반복 구조를 아래와 같이 먼저 파란색을 반복하여 아래와 같은 이중 리스트를 만들 수 있다.

[ [ 1 ], [ 2, 15 ], [ 3, 14 ], [ 4, 13 ], [ 5, 12 ], [ 6, 7, 8, 9, 10, 11 ] ]

 

다음에는 빨간색을 반복하여 아래와 같은 이중 리스트를 만들 수 있다.

[ [ 16 ], [ 17, 21 ], [ 18, 19, 20 ] ]

 

 

파란색 리스트 사이에 빨간색 리스트를 삽입하면 아래와 같은 리스트가 나온다.

[ [ 1 ], [ 2, 15 ], [ 3, 16, 14 ], [ 4, 17, 21, 13 ], [ 5, 18, 19, 20, 12 ], [ 6, 7, 8, 9, 10, 11 ] ]

 
 
[그림3] 삼각 달팽이의 숫자를 저장할 순서

 

이중 리스트를 한 개의 리스트로 바꿔주면 완성된다.

[ 1, 2, 15, 3, 16, 14, 4, 17, 21, 13, 5, 18, 19, 20, 12, 6, 7, 8, 9, 10, 11 ]

 

 

[주의사항]

안쪽 삼각 달팽이의 개수와 모양이 변경될 수 있다. n이 커지면 삼각 달팽이는 많아지고 n4인 경우처럼 안쪽 삼각형이 1개만 있어서 삼각 모양이 아닐 수도 있으므로 이러한 조건에 대응해야 한다.

 

 

 

 

[풀이 코드]

삼각 달팽이를 이중 리스트로 초기화하고 삼각 달팽이에 들어갈 최댓값을 구하는 함수이다.

[그림4] 삼각 달팽이 초기화할 init 함수

 

 

 

리스트에 숫자를 대입하며 삼각 달팽이를 만들어 주는 함수이다.

 

첫 번째 실행될 때는 삼각 달팽이의 가장 바깥쪽 테두리를 만들어 준다.

[ [ 1 ], [ 2, 15 ], [ 3, 14 ], [ 4, 13 ], [ 5, 12 ], [ 6, 7, 8, 9, 10, 11 ] ]

 

두 번째 실행될 때는 삼각 달팽이의 안쪽 테두리를 추가한다.

[ [ 1 ], [ 2, 15 ], [ 3, 16, 14 ], [ 4, 17, 21, 13 ], [ 5, 18, 19, 20, 12 ], [ 6, 7, 8, 9, 10, 11 ] ]

 

startNO : 삼각형의 시작 숫자

startRow : 삼각형의 시작 높이

n : 삼각형의 한 변의 길이

list : 숫자가 저장될 리스트

border : 삼각 달팽이의 테두리 번호 (안쪽 테두리를 삽입할 인덱스 번호)

[그림5] 삼각 달팽이를 만들 triangle 함수

 

 

솔루션 함수이다.

반복을 돌면서 삼각 달팽이를 만들고 이중 리스트를 한 개의 리스트로 변경한다.

[그림6] 솔루션 함수

 

 

 

[정리]

삼각 달팽이 구조를 만들 때 반복 구조를 어떻게 할 것 인지가 중요하다.

1부터 커지는 숫자를 보면 달팽이 모양인데 끊어지지 않고 한 번에 연결할 규칙을 찾는 것이 어려웠다.

그래서 양파처럼 껍질처럼 하나의 테두리에 집중하여 리스트로 숫자를 만들고 바깥 테두리와 안쪽 테두리의 차이를 분석하여 반복 구조를 완성하였다.

 

이 문제는 달팽이로 보기보다 양파로 바꿔서 보니 생각이 바뀌면서 자연스럽게 해결 방법이 아주 빠르게 정리되었다.

달팽이를 양파로 보는 다른 시선처럼 보는 관점을 다르게 하는 것의 중요성을 강조하고 싶다.

 

 

 

 

728x90
반응형

 

728x90
반응형