모의고사
⚽ 문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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문제씩을 맞췄습니다.
풀이 계획
#1
수포자가 찍는 방식에 대한 조건을 찾으려 했다가 그냥 기입해서 사용했다.
정답에 따라 맞힌 개수에 대한 배열을 생성했다.
맞힌 개수의 최댓값을 찾아 많이 맞힌 사람의 배열을 만들어 담았다.
결과는 실패.
#2
다른 방법을 생각해보자.
점수 내는 것 까지는 맞게 한 것 같으니 가장 많이 맞힌 사람을 다시 구해보자.
배열 맨 뒤에 값을 넣는 함수를 만들어봤다.
하지만 또 실패.
(코드가 더 복잡해진 것 같은데 정확성은 올랐다.)
#3
이번엔 Arrays의 sort와 copyOf를 사용해서 코딩해봤다.
소스는 간결해졌으나 정확도는 다시 떨어졌다..
제자리 걸음 중ㅠㅜ
#4
다시 처음으로 돌아가서 고민해보자.
3번째 풀이의 max값 구하는 것을 활용하고, 새로운 배열의 인덱스를 늘려 최대값인 애들만 넣어줬다.
드디어 성공!
🍓 Java
나의 문제 풀이
// 실패한 첫 번째 풀이
class Solution {
public int[] solution(int[] answers) {
int[] supoja1 = {1, 2, 3, 4, 5};
int[] supoja2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] supoja3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] score = new int[3];
for(int i = 0; i < answers.length; i++) {
if(answers[i] == supoja1[i%supoja1.length]) {
score[0]++;
}
if(answers[i] == supoja2[i%supoja2.length]) {
score[1]++;
}
if(answers[i] == supoja3[i%supoja3.length]) {
score[2]++;
}
}
int max = 0;
int count = 1;
for(int i = 0; i < score.length; i++) {
if(score[i] > max) {
max = score[i];
} else if(score[i] == max) {
count++;
}
}
int[] answer = new int[count];
for(int i = 0; i < score.length; i++) {
if(score[i] == max) {
answer[i] = i+1;
}
}
return answer;
}
}
// 실패한 두 번째 풀이
import java.util.Arrays;
class Solution {
public int[] solution(int[] answers) {
int[] supoja1 = {1, 2, 3, 4, 5};
int[] supoja2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] supoja3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] score = new int[3];
for(int i = 0; i < answers.length; i++) {
if(answers[i] == supoja1[i%supoja1.length]) {
score[0]++;
}
if(answers[i] == supoja2[i%supoja2.length]) {
score[1]++;
}
if(answers[i] == supoja3[i%supoja3.length]) {
score[2]++;
}
}
int[] answer = new int[score.length];
int max = 0;
int count = 1;
for(int i = 0; i < score.length; i++) {
if(max < score[i]) {
max = score[i];
answer = new int[score.length];
answer[0] = i+1;
} else if(max == score[i]) {
array(answer, i+1);
count++;
}
}
int[] result = new int[count];
result = Arrays.copyOf(answer, count);
return result;
}
public int[] array(int[] arr, int num) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == 0) {
arr[i] = num;
return arr;
}
}
return arr;
}
}
// 실패한 세 번째 풀이
import java.util.Arrays;
class Solution {
public int[] solution(int[] answers) {
int[] supoja1 = {1, 2, 3, 4, 5};
int[] supoja2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] supoja3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] score = new int[3];
for(int i = 0; i < answers.length; i++) {
if(answers[i] == supoja1[i%supoja1.length]) {
score[0]++;
}
if(answers[i] == supoja2[i%supoja2.length]) {
score[1]++;
}
if(answers[i] == supoja3[i%supoja3.length]) {
score[2]++;
}
}
int[] sort_score = Arrays.copyOf(score, score.length);
Arrays.sort(sort_score);
int max = sort_score[sort_score.length-1];
int count = 0;
int[] answer = new int[score.length];
for(int i = 0; i < score.length; i++) {
if(score[i] == max) {
count++;
answer[i] = i+1;
}
}
return Arrays.copyOf(answer, count);
}
}
// 드디어 성공한 풀이!
import java.util.Arrays;
class Solution {
public int[] solution(int[] answers) {
int[][] supoja = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] score = new int[3];
for(int i = 0; i < answers.length; i++) {
for(int s = 0; s < supoja.length; s++) {
if(answers[i] == supoja[s][i%supoja[s].length]) {
score[s]++;
}
}
}
int[] scoreSort = Arrays.copyOf(score, score.length);
Arrays.sort(scoreSort);
int max = scoreSort[scoreSort.length-1];
int count = 1;
for(int i = scoreSort.length-1; i > 0; i--) {
if( scoreSort[i-1] == max ) {
count++;
} else {
break;
}
}
int[] answer = new int[count];
int idx = 0;
for(int i = 0; i < score.length; i++) {
if( score[i] == max ) {
answer[idx] = i+1;
idx++;
}
}
return answer;
}
}
🌿 핵심 정리
Arrays.copyOf(배열, 길이)
: 배열을 길이만큼 복사한 새로운 배열 반환
Arrays.sort(배열)
: 오름차순 정렬 (원본 배열이 변경됨)
✌ 반성의 시간
테스트 때는 성공했는데 채점을 하니 다 실패.. 대체 왜..?
이 코드에서 max 구하는 부분을 나는 명 수가 늘어날 것을 생각해 코딩했지만
Math.max(score[0], Math.max(score[1], score[2]));
이런식으로 적거나 최댓값인 사람을 list를 활용했으면 더 쉽게 했을 것 같다.
(너무 시간이 오래 걸렸다)
'Note > Coding Test' 카테고리의 다른 글
[프로그래머스] 두 개 뽑아서 더하기 (Java 풀이) (0) | 2021.07.09 |
---|---|
[프로그래머스] 완주하지 못한 선수 (JavaScript 풀이) (0) | 2021.07.07 |
[프로그래머스] 체육복 (Java 풀이) (0) | 2021.07.05 |
[프로그래머스] Level 1: 로또의 최고 순위와 최저 순위 (Java) 문제 풀이 / 핵심 내용 정리 (0) | 2021.07.04 |
[프로그래머스] Level 1: 폰켓몬 (Java) 문제 풀이 / 핵심 내용 정리 (0) | 2021.07.04 |