문제
https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해설
삼각형이라는 구조를 생각해보고 그림을 유심히 보면, n=5 일 때, 1번에서 아래 방향으로 순차적으로 [1,2,3,4,5]까지 채우고 방향을 오른쪽으로 바꿔서 [6,7,8,9] 채우고 방향을 바꿔서 [10,11,12] 채우고 다시 방향 바꿔서 [13,14] 채우고 방향 바꿔서 [15]채운다.
즉, n = 5일 때 [1,2,3,4,5], [6,7,8,9], [10,11,12], [13,14], [15] 이렇게 요소의 갯수를 (n - 회차)로 정하고 방향을 바꿔가며 배열에 넣어주고 있다.
주어진 수 n 만큼 회차를 진행할 것이고 각 회차별 요소의 갯수는 n-회차로 나타낼 수 있다.
삼각형이므로 방향은 하, 우, 좌 총 3가지이다. 이는 회차를 3으로 나눈 나머지값으로 체크할 수 있다.
그리고 마지막으로 각 배열을 하나의 배열로 합쳐주기 위해 sum(중첩된 배열, []) 메서드를 사용한다.
def solution(n):
answer = [[0 for _ in range(i+1)] for i in range(n)]
x, y = -1, 0
num = 1
for i in range(n): # 현재 회차의 방향 설정
for _ in range(i, n): # 좌표 구하기
if i % 3 == 0: # 하
x += 1
elif i % 3 == 1: # 우
y += 1
else:
x -= 1
y -= 1
answer[x][y] = num
num += 1
return sum(answer,[])
우선 각 행과 행이 포함할 수 있는 요소의 갯수에 맞게 배열을 설정해준다.
- 처음 방향은 아래로 향해야하므로, 초기 x 좌표를 -1로 설정해준다.
- i는 현재회차를 의미한다. i가 0일 때, 현재 회차의 반복횟수는 n - i이므로 중첩반복문의 횟수를 for _ in range(i, n)으로 설정한다.
- 현재회차의 방향을 설정해주기 위해 3으로 나눈 나머지가 0인 경우 가장 첫번째로 시작할 방향인 '아래' 방향, 나머지가 1인 경우 두번째로 진행할 방향인 '우', 위 경우에 해당하지 않는 경우는 '상'의 방향으로 설정한다.
- 이 때, '상' 방향으로 진행할 때는 x, y 좌표 모두 1씩 이동해야하는 것을 주의하자.
'Python' 카테고리의 다른 글
프로그래머스 - 크기가 작은 부분 문자열 (2) | 2024.04.05 |
---|---|
프로그래머스 - 콜라츠 추측 (2) | 2024.04.04 |
프로그래머스 - 숫자 문자열과 영단어 (0) | 2024.04.02 |
프로그래머스 - 체육복 (0) | 2024.04.01 |
프로그래머스 - 부족한 금액 계산하기 (0) | 2024.03.31 |