https://programmers.co.kr/learn/courses/30/lessons/42840#
풀이
a부터 c까지 각각 1번부터 3번 학생의 찍기 패턴을 정의하였고,
그리고 모두 같은 점수를 받을 경우를 고려하여 1~3의 key를 초기값 0으로 정의하여 loser 오브젝트를 정의했다.
문제는 최대 10,000개일 수 있으므로 answers의 길이만큼 반복한다.
1~3번 학생들은 각자의 패턴이 다르므로 각각 j, k, l로 반복된다.
각각의 패턴에 정답을 대조하여 같으면 1~3번 key의 value로 카운트를 세도록 하였다.
과정이 끝나면 배열 answer에 각 카운트를 집어넣고,
Object.keys()를 활용하여 오브젝트에 존재하는 keys들을 배열로 불러온다.
체이닝으로 filter()를 활용하여 key의 value가 answer의 최댓값에 해당하는 key들만 필터링한다.
마지막으로 문자열 형식으로 저장된 key를 parseInt()를 활용하여 정수로 바꿔준 후 반환한다.
function solution(answers) {
var answer = [];
var loser = {a:[1,2,3,4,5],b:[2,1,2,3,2,4,2,5],c:[3,3,1,1,2,2,4,4,5,5],1:0,2:0,3:0};
for(let i=0,j=0,k=0,l=0; i<answers.length; i++,j++,k++,l++){
j > 4 ? j=0 : j=j;
k > 7 ? k=0 : k=k;
l > 9 ? l=0 : l=l;
answers[i] === loser['a'][j] ? loser[1]+= 1 : loser[1] += 0;
answers[i] === loser['b'][k] ? loser[2] += 1 : loser[2] += 0;
answers[i] === loser['c'][l] ? loser[3] += 1 : loser[3] += 0;
}
answer.push(loser[1],loser[2],loser[3]);
return Object.keys(loser).filter(key=>loser[key] === Math.max.apply(null,answer)).map(num=>parseInt(num));
}
다른 사람 풀이
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;
}
패턴 할당은 같다.
하지만 점수를 세는 과정이 다른데 나에 비하면 매우 깔끔하신 것 같다ㅠ
먼저 a1c~a3c는 1번~3번 학생의 점수 카운트인데,
filter 메소드로 주어진 정답지 answers의 a, i를 변수로 설정하였다.
여기서 a는 정답, i는 인덱스이다.
이어서 a === a1[i%a1.length] 구간을 대표로 보면 나는 삼항 연산자로 패턴을 유지하고 있는 데 비해,
이 분은 각 패턴 배열의 길이로 나눈 나머지 값을 사용하여 더 깔끔하게 코드를 작성하셨다.
그렇게 같은 정답만을 필터링한 배열을 a1c~a3c에 각각 저장하고,
이들의 최댓값을 max로 정의하였다.
마지막으로 나는 오브젝트를 활용하여 중복 최고 점수일 때의 인덱스 문제를 해결했지만,
그냥 if문으로 각각 1~3을 배열에 할당하였다.
내가 배열에 대한 메소드를 활용할 때 인덱스를 활용하지 않는 것을 알았다.
한 가지의 변수만 허용되는 것처럼 나도 모르게 늘 변수를 정할 때 하나만 생각한다.
다음부터는 메소드를 사용할 때마다 의식적으로 떠올리려고 노력해야겠다.
'IT > Algorithm' 카테고리의 다른 글
프로그래머스) [1차] 비밀지도 (0) | 2021.07.05 |
---|---|
프로그래머스) 음양 더하기 (0) | 2021.07.05 |
프로그래머스) 문자열 다루기 기본 (0) | 2021.07.01 |
프로그래머스) 신규 아이디 추천 (0) | 2021.06.30 |
프로그래머스) 폰켓몬 (0) | 2021.06.25 |