티스토리 뷰
출처: https://programmers.co.kr/learn/courses/30/lessons/42840
문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
제한 조건
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
입출력 예
answers | return |
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
입출력 예 설명
입출력 예 #1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
- 모든 사람이 2문제씩을 맞췄습니다.
나의 풀이
function solution(answers) {
var answer = [];
let soopoza1=[1,2,3,4,5];
let soopoza2=[2,1,2,3,2,4,2,5];
let soopoza3=[3,3,1,1,2,2,4,4,5,5];
let score1=0;
let score2=0;
let score3=0;
let pointer1=0;
let pointer2=0;
let pointer3=0;
let rank=[];
for(let i=0; i<answers.length; i++){
if(answers[i]==soopoza1[pointer1]){
score1++;
}
if(answers[i]==soopoza2[pointer2]){
score2++;
}
if(answers[i]==soopoza3[pointer3]){
score3++;
}
pointer1++;
if(pointer1==soopoza1.length) pointer1=0;
pointer2++;
if(pointer2==soopoza2.length) pointer2=0;
pointer3++;
if(pointer3==soopoza3.length) pointer3=0;
}
if(score1==score2 &&score1==score3){
rank.push(1);rank.push(2);rank.push(3);
}
else if(score1==score2 &&score1>score3){
rank.push(1);rank.push(2);
}
else if(score1==score3 &&score1>score2){
rank.push(1);rank.push(3);
}
else if(score3==score2 &&score3>score1){
rank.push(2);rank.push(3);
}
else if(score1>score2 &&score1>score3){
rank.push(1);
}
else if(score2>score1 &&score2>score3){
rank.push(2);
}
else if(score3>score2 &&score3>score1){
rank.push(3);
}
return rank;
}
수포자가 3명이라서 쉽게 풀 수 있었다.
수포자가 3명이니까 나올 수 있는 부분집합은 2^3=8개, 공집합을 빼면 7개
이 7개의 부분집합을 전부 if문을 통해 나눠줬는데
수포자가 4명이면 (2^4)-1=15, 15개의 if문을 만들어 줘야한다;;
문제 제작자가 if문으로도 풀 수 있게 배려를 해준 것 같다.
사용된 변수도 좀 많은데, 배열 안에서 순환하려고 현재 배열 안에서 가리키고 있는 요소(정답 비교를 위해 사용되는 요소)를 나타내기 위해 pointer라는 변수를 사용했다. 여기서 쓰인 pointer라는 변수는 다른 사람 풀이를 보면 부끄러워서 숨기고 싶은 변수가 된다.
다른 사람 풀이
function solution(answers) {
var answer = [];
const a = [1,2,3,4,5];
const b = [2,1,2,3,2,4,2,5];
const c = [3,3,1,1,2,2,4,4,5,5];
var aAnswer = 0;
var bAnswer = 0;
var cAnswer = 0;
for(var i=0; i < answers.length;i++){
if(answers[i] == a[i%a.length]){
aAnswer++;
}
if(answers[i] == b[i%b.length]){
bAnswer++;
}if(answers[i] == c[i%c.length]){
cAnswer++;
}
}
const max = Math.max(aAnswer, bAnswer, cAnswer);
var allAnswer = [aAnswer, bAnswer, cAnswer];
for(var i=0; i<allAnswer.length;i++){
if(allAnswer[i]==max){
answer.push(i+1);
}
}
return answer;
}
같이 알고리즘 스터디 하는 분의 코드다.
배열 안에서 순환하기위해 나머지 연산자를 사용했다. 와우. 나는 왜 이런 생각을 하지 못했을까
가장 점수가 높은 사람을 찾기 위해 Math.max()함수를 사용했다. 이 함수를 사용하면 수포자가 100명, 1000명이어도 쉽게 풀 수 있다.
오늘의 함수
Math.max()
입력값으로 받은 0개 이상의 숫자 중 가장 큰 숫자를 반환
Math.max(10, 20); // 20
입력값으로 배열을 받아서 배열 안에서 가장 큰 수를 찾을 수도 있다.
var arr = [1, 2, 3];
var max = Math.max(...arr);
'자료구조 알고리즘' 카테고리의 다른 글
[java script] 부분집합 만들기. (1) | 2021.05.10 |
---|---|
[프로그래머스] 구명보트 (0) | 2021.04.25 |
[프로그래머스] K번째 수 (java script) (0) | 2021.04.10 |
[프로그래머스] 124 나라의 숫자 (java script) (0) | 2021.04.10 |
[프로그래머스] 피보나치 수 (java script) (0) | 2021.04.09 |
- Total
- Today
- Yesterday
- 서버개발
- 투포인터
- node.js
- 면접질문
- 다이나밍프로그래밍
- create db
- 면접비
- 투포인터 연습
- 은둔청년체험
- 그래프
- 로드나인
- BFS
- 개발자면접
- DB 생성
- 다이나믹프로그래밍
- create databases;
- 롱베케이션
- MySQL
- 서버점검
- MOD
- 최소공통조상
- 동적프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |