Problem
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
- 제한 조건
1. 시험은 최대 10,000 문제로 구성되어있습니다.
2. 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
3. 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
Solution
문제분석
return 가장 많은 문제를 맞춘 사람 (여러명이라면 오름차순 정렬)
문제풀이
1. 각 1,2,3번 사람 (나는 a,b.c로 지정했다)이 찍는 방식은 패턴이 있다. 반복되는 패털을 각 변수에 넣어준다
2. 반복문으로 answers가 끝날 때까지 돌리는데 answers[i]와 각 a,b,c 차례대로 같은지 확인하고 같다면 각 점수를 더해줄 배열에 +해준다. (abc[0]은 a의 점수 abc[1]은 b의 점수 abc[2]는 c의 점수이다)
3. 여기서 a, b, c 각 배열의 요소 개수는 다르므로 a,b,c 배열 요소 차례를 넣어준 j배열에 a,b,c를 인덱스 순서대로 넣어놨는데 +1씩 해주다가 각 배열 요소가 해당하는 a, b, c의 길이보다 같거나 커질 경우 다시 0으로 리셋해둔다.
4. 반복문이 끝난 이후 Math.max로 a,b,c중 가장 큰 수를 뽑아낸다
5. 큰 수와 각 요소의 값(abc)과 동일하다면 answers에 해당 인덱스 + 1을 push한다.
abc[0]은 a의 점수이고 a는 1번 수포자이므로 인덱스 + 1을 해주는 것이다.
function solution(answers) {
let a = "12345";
let b = "21232425";
let c = "3311224455";
let abc = [0, 0, 0];
let j = [0, 0, 0];
let answer = [];
for(let i = 0; i < answers.length; i++){
if(a[j[0]] == answers[i]) abc[0] += 1;
if(b[j[1]] == answers[i]) abc[1] += 1;
if(c[j[2]] == answers[i]) abc[2] += 1;
j[0] += 1;
j[1] += 1;
j[2] += 1;
if(j[0] >= a.length) j[0] = 0;
if(j[1] >= b.length) j[1] = 0;
if(j[2] >= c.length) j[2] =0;
}
const max = Math.max(...abc)
for(i = 0; i < abc.length; i++){
if(max === abc[i]) answer.push(i+1);
}
return answer;
}
통과하긴 했으나... 조잡해보이고 쓸데없이 변수와 배열을 많이 지정해서 써먹는 거 같아서 다른 풀이를 확인해보았다.
function solution(answers) {
var answer = [];
const man1 = [1, 2, 3, 4, 5];
const man2 = [2, 1, 2, 3, 2, 4, 2, 5];
const man3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
let count = [0, 0, 0];
for(let i = 0; i < answers.length; i++) {
if(answers[i] == man1[i % man1.length]) count[0]++;
if(answers[i] == man2[i % man2.length]) count[1]++;
if(answers[i] == man3[i % man3.length]) count[2]++;
}
const max = Math.max(count[0], count[1], count[2]);
for(let i = 0; i < count.length; i++) {
if(max == count[i]) answer.push(i + 1);
}
return answer;
}
answers의 값과 각 수포자들의 값을 확인할 때 man1[i % man1.length] 은 생각하지 못하던 방법이다.
내가 위에 생성한 j배열 없이도 풀 수 있는 방법이었다. 좋은 코드라고 판단된다.
'프로그래머스 (JS) > Lv. 1' 카테고리의 다른 글
[Programmers / JS] 42889번 - 실패율 (0) | 2023.03.23 |
---|---|
[Programmers / JS] 12977번 - 소수 만들기 (0) | 2023.03.23 |
[Programmers / JS] 12921번 - 소수 찾기 (0) | 2023.03.22 |
[Programmers / JS] 142086번 - 가장 가까운 같은 글자 (0) | 2023.03.21 |
[Programmers / JS] 134240번 - 푸드 파이트 대회 (0) | 2023.03.21 |