티스토리 뷰
💡 문제
🔍 분석 및 계획
✅ 문제 이해
1~5의 자연수 내 일정한 규칙으로 반복되는 3개의 집합이 있다. 여기에 동일한 범위내 입력이 주어질 때 각 순서와 값이 일치하는 개수를 각각 카운트해서 많이 일치하는 순서대로 나열하라
- 입력 값 : 숫자 배열
- 숫자 배열의 길이 <= 10,000
- 숫자 배열의 값은 1, 2, 3, 4, 5 중 하나 - 출력 값 : 숫자 배열
- 가장 일치하는 개수가 많은 집합 번호 (1, 2, 3중 하나)
- 여럿 일 경우 오름차순으로 나타낸다
1, 2, 3번 규칙
1 - [1, 2, 3, 4, 5] 반복 (주기 5)
2 - [2, 1, 2, 3, 2, 4, 2, 5] 반복 (주기 8)
3 - [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] 반복 (주기 10)
풀이순서
1. 반복문을 통해 입력배열을 순회한다
2. 나눗셈 연산을 이용해 나머지와 수를 비교한다
3. 비교하여 일치하면 +1
4. 각 개수를 비교하여 출력
✅ 의사코드 작성
// 반복문을 통해 입력값(answer)을 순회한다
// 나머지 값과 비교하며 일치하는 숫자를 각각 카운트한다
// 점수기준 내림차순
// if(가장 높은 점수와 두번째 점수 비교하여 다를 시) return 제일 높은 점수 번호
// else if(두번째 높은 점수와 세번째 점수 다를 시) return 1,2등 번호
// else return 3개 번호
📝 코드 구현
의사코드 + 코드
function solution(answers) {
const routine = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
const score = [
[1, 0],
[2, 0],
[3, 0],
];
// 반복문을 통해 입력값(answers)을 순회한다
answers.forEach((v, i) => {
// 나머지 값과 비교하며 일치하는 숫자를 각각 카운트한다
if (v === routine[0][i % 5]) score[0][1]++;
if (v === routine[1][i % 8]) score[1][1]++;
if (v === routine[2][i % 10]) score[2][1]++;
});
// 점수기준 내림차순
score.sort((a, b) => b[1] - a[1]);
// if(가장 높은 점수와 두번째 점수 비교하여 다를 시) return 제일 높은 점수 번호
if (score[0][1] !== score[1][1]) return [score[0][0]];
// else if(두번째 높은 점수와 세번째 점수 다를 시) return 1,2등 번호
else if (score[1][1] !== score[2][1]) return [score[0][0], score[1][0]];
// else return 3개 번호
else return [score[0][0], score[1][0], score[2][0]];
}
최종 코드
function solution(answers) {
const routine = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
const score = [
[1, 0],
[2, 0],
[3, 0],
];
answers.forEach((v, i) => {
if (v === routine[0][i % 5]) score[0][1]++;
if (v === routine[1][i % 8]) score[1][1]++;
if (v === routine[2][i % 10]) score[2][1]++;
});
score.sort((a, b) => b[1] - a[1]);
if (score[0][1] !== score[1][1]) return [score[0][0]];
else if (score[1][1] !== score[2][1]) return [score[0][0], score[1][0]];
else return [score[0][0], score[1][0], score[2][0]];
}
시간 복잡도 : O(n)
💭 되돌아 보기
✅ 다른 사람 풀이
1.
비슷해보이면서도 다르게 표현된 식이다
- filter를 사용해서 추출한배열의 길이로 개수를 카운트 하기
- 오름차순할 필요없이 max를 저장하고 순서대로 push하기
1,2번은 다른 문제에서도 응용하기 좋은 아이디어다
function solution(answers) {
var answer = [];
var a1 = [1, 2, 3, 4, 5];
var a2 = [2, 1, 2, 3, 2, 4, 2, 5]
var a3 = [ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
var a1c = answers.filter((a,i)=> a === a1[i%a1.length]).length;
var a2c = answers.filter((a,i)=> a === a2[i%a2.length]).length;
var a3c = answers.filter((a,i)=> a === a3[i%a3.length]).length;
var max = Math.max(a1c,a2c,a3c);
if (a1c === max) {answer.push(1)};
if (a2c === max) {answer.push(2)};
if (a3c === max) {answer.push(3)};
return answer;
}
2.
조건들을 걸러내기에 아주 직관적인 코드로 짜여진 풀이이다.
문자와 배열간 변환도 많고 실제 복잡도는 모르겠지만 O(n³)형태를 띄고 있는것 같다.
reduce
+ for ( i< length)
+ includes
하지만 채점을 통과한것으로 보아 시간이 오래 걸리지 않은것같은데 이 부분은 아직 모르겠다
문자와 배열간 변환도 많고 실제 복잡도는 모르겠지만 O(n³)형태를 띄고 있는것 같다.
reduce
+ for ( i< length)
+ includes
하지만 채점을 통과한것으로 보아 시간이 오래 걸리지 않은것같은데 이 부분은 아직 모르겠다
function solution(babbling) {
const babblables = ["aya", "ye", "woo", "ma"];
return babbling.reduce((possible, babbl, index) => {
for (let i = 0; i < babblables.length; i += 1) {
if (babbl.includes(babblables[i].repeat(2))) return possible;
}
for (let i = 0; i < babblables.length; i += 1) {
babbl = babbl.split(babblables[i]).join(' ').trim();
}
if (babbl) return possible;
return possible += 1;
}, 0)
}
'IT기초 > 프로그래머스 문제풀이' 카테고리의 다른 글
| [프로그래머스 LV.1] #35 완주하지 못한 선수 (JavaScript) (0) | 2023.06.03 |
|---|---|
| [프로그래머스 LV.1] #34 k번째수 (JavaScript) (0) | 2023.06.02 |
| [프로그래머스 LV.1] #32 체육복 (JavaScript) (0) | 2023.05.31 |
| [프로그래머스 LV.1] #31 크레인 인형뽑기 게임 (JavaScript) (0) | 2023.05.30 |
| [프로그래머스 LV.1] #30 키패드 누르기 (JavaScript) (0) | 2023.05.29 |
댓글
