반응형
코딩테스트 연습 - 산 모양 타일링 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
위를 바라보는 N + 1개의 삼각형, 아래를 바라보는 N개의 삼각형이 있으며
tops 배열로 위에 붙여지는 추가 삼각형을 받습니다.
타일의 모양이 다양하여 어렵게 느껴질 수 있지만 평범한 타일 문제입니다.
풀이 방법
우선 이런 문제는 시간이 걸리더라도 실제 경우의 수를 계산해 볼 필요가 있습니다.
경우의 수를 그려놓고 패턴을 찾아보는게 중요합니다.
배열 tops안의 값들이 모두 0일 때의 경우의 수
N[0] = 1; (N이 0일 때)
N[1] = 3; (N이 1일 때)
N[2] = 8;
N[3] = 21;
점화식을 구해보자면 아래와 같습니다.
N[i] = N[i-1] * 3 - N[i-2];
배열 tops안의 값들이 모두 1일 때의 경우의 수
N[0] = 1; (N이 0일 때)
N[1] = 4; (N이 1일 때)
N[2] = 15;
N[3] = 56;
점화식을 구해보자면 아래와 같습니다.
N[i] = N[i-1] * 4 - N[i-2];
tops배열을 순회하면서 0이면 첫번째 점화식으로 1이라면 두번째 점화식으로 구하면 될것 같습니다.
// 0 = 1
// 1 = 3 4
// 2 = 8 11 11 15
// 3 = 21 29 30 41 29 40 41 56
왼쪽 자식 -> top이 0일 때, 오른쪽 자식 -> top이 1일 때
정답 코드
int solution(int n, vector<int> tops) {
vector<int> v(n + 1);
v[0] = 1;
v[1] = 3 + tops[0];
for (int i = 2; i <= n; i++) {
v[i] = (v[i-1] * (3 + tops[i-1]) - v[i-2]) % 10007;
if (v[i] < 0)
v[i] += 10007; // 음수를 방지
}
return v[n];
}
반응형
LIST
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
미로 탈출 명령어 [Lv.3] (0) | 2024.06.02 |
---|---|
택배 배달과 수거하기 [Lv.2] (0) | 2024.06.01 |
이모티콘 할인행사 [Lv.2] (0) | 2024.05.30 |
주사위 고르기 [Lv.3] (0) | 2024.05.27 |
도넛과 막대 그래프 (그래프 탐색) [Lv.2] (0) | 2024.05.22 |