문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/68645
문제 설명
정수 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] |
문제 풀이
간단한 구현 문제이다. 2차원 배열에 수를 채워 넣는 방법으로 문제를 풀었다.
삼각형을 달팽이 모양으로 만드는데 반복되는 규칙이 있다. 규칙은 아래와 같이 크게 3가지로 구분된다.
- n번만큼 배열의 x좌표가 증가한다. 이후 n을 1 감소시킨다.
- n번만큼 배열의 y좌표가 증가한다. 이후 n을 1 감소시킨다.
- n번만큼 배열의 x, y좌표가 동시에 감소한다. 이후 n을 1 감소시킨다.
- n 이 0이 될 때까지 1,2,3을 반복하며 배열에 수를 채워 넣는다.
위의 세 가지 규칙을 순서대로 반복하며 수를 채우면 된다. 이해를 돕기 위해 구체적으로 예를 들어보자면 n=4일 경우
아래와 같인 2차원 배열을 초기화한다.
arr = [[0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]
이후 위 규칙에 따라 숫자를 증가시키며 arr배열에 수를 갱신한다. 위 규칙에 따라 추가될 수와 x, y좌표를 표로 표현하면 아래와 같다.
n | 배열의 x좌표, y좌표 | 추가될 수 |
4 | (0, 0) | 1 |
4 | (1, 0) | 2 |
4 | (2, 0) | 3 |
4 | (3, 0) | 4 |
3 | (3, 1) | 5 |
3 | (3, 2) | 6 |
3 | (3, 3) | 7 |
2 | (2, 2) | 8 |
2 | (1, 1) | 9 |
1 | (2, 1) | 10 |
구현 코드
코드 링크 : 삼각 달팽이
def solution(n):
answer = []
arr = []
for i in range(1, n+1):
arr.append([0]*i)
x = -1
y = 0
flag = 0
num = 1
while n > 0:
if flag % 3 == 0:
for i in range(n):
x += 1
arr[x][y]= num
num+=1
elif flag % 3 == 1:
for i in range(n):
y += 1
arr[x][y] = num
num+=1
else:
for i in range(n):
x -= 1
y -= 1
arr[x][y] = num
num+=1
flag += 1
n -= 1
for row in arr:
for value in row:
answer.append(value)
return answer
'Problem Solving > Programmers' 카테고리의 다른 글
Programmers - 전력망을 둘로 나누기[파이썬(python)] (0) | 2022.04.28 |
---|---|
Programmers - 주식가격[파이썬(python)] (0) | 2022.04.24 |
Programmers - 2개 이하로 다른 비트[파이썬(python)] (0) | 2022.04.22 |
Programmers - 피로도[파이썬(python)] (0) | 2022.04.21 |
Programmers - 큰 수 만들기[파이썬(python)] (0) | 2022.04.20 |
댓글