728x90
문제
풀이
필자는 해당 문제를 단순 구현으로 풀이하려 했다. DP 알고리즘을 이용해 이전 문자열 + '0'.repeat(5 ** (i - 1)) + 이전 문자열 로 문자열을 구해 풀려했지만, 특정 케이스에서는 컴파일 에러가 발생했다.
그래서 수학적인 접근을 시도했다. 우선 문자열에서 규칙을 찾아보자면, 1의 개수는 4 * n개 이다. 그리고 0은 5개로 자른 문자열에서 항상 2번 인덱스에 위치한다.
이와같은 특징을 이용해 1과 0을 구분할 수 있는 check 함수를 제작해보자.
check 함수에서는 크게 3가지 경우를 처리한다.
1. 입력된 인덱스 값이 5보다 작으며, 5로 나눈 나머지가 2인지 아닌지
2. 인덱스 값이 5보다 크지만, (인덱스값 - 2) % 5 가 0인 경우는 5개 이후 연속되는 5개의 문자열에서 2번째 위치를 차지하는지 검증해야 한다.
3. 만약 위의 두 개의 조건에 부합하지 않는다면, 5로 나눈 몫을 재귀적으로 check 함수를 호출해야 한다.
코드
const solution = (n, l, r) => {
let cnt = 0;
const check = (index) => {
if (index < 5) {
return index % 5 === 2 ? false : true;
}
if ((index - 2) % 5 === 0) return false;
return check(Math.floor(index / 5));
}
for (let i = l - 1; i < r; i++) {
if (check(i)) {
cnt += 1;
}
}
return cnt;
};
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[Level 3] 정수 삼각형 (1) | 2024.11.08 |
---|---|
[JS] [PCCP 기출문제] 3번 충돌위험 찾기 (0) | 2024.11.05 |
[JS] 괄호 변경 (0) | 2024.10.04 |
[JS] 자물쇠와 열쇠 (0) | 2024.10.03 |
[JS] 양과 늑대 (0) | 2024.10.01 |