문제
모의고사
https://programmers.co.kr/learn/courses/30/lessons/42840?language=java
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
생각해보기
- 무조건 3명이다보니 int 크기를 3으로 잡기
- 찍어서 정답과 일치하는 갯수를 int[]배열에 담기
- 정답 최대 갯수부터 비교하여 일치한 것이 있다면 List or int[] 배열에 담기
- List or int[] 가 비어있지 않다면 바로 탈출
Code
- 수포자는 무조건 3명이고 찍는 방식이 정해져 있으므로 final로 초기화.
- 맞은 갯수를 담을 int 배열인 answer을 만들어 크기를 3으로 지정.
- 정답과 비교하면서 1번은 0번 index, 2번은 1번 index, 3번은 2번 index의 맞은 갯수를 answer에 담아 준다.
- 결과물을 담을 int배열 result를 생성하고 가장 많이 맞춘 사람이 몇 명인지 모르니 초기화는 하지 않는다.
- 모든 정답을 맞출 경우부터 확인하기 위해 k를 정답의 길이만큼 초기화.
- while문 안에 임시로 가장 많이 맞춘 사람의 값을 담아두기 위해 list를 생성
- while문을 통해 k가 0이 되기 전까지 돌면서 answer의 값과 k가 같다면 list에 추가
- list size만큼 result를 초기화하고 list가 비어있지 않다면 list값을 result에 넣고 break를 통해 탈출.
)
Java
- List로 결과를 받고 stream을 이용해 int배열로 변환한 풀이
import java.util.*;
class Solution {
// 1번 수포자 찍는 방식
static final int[] guess1 = {1, 2, 3, 4, 5};
// 2번 수포자 찍는 방식
static final int[] guess2 = {2, 1, 2, 3, 2, 4, 2, 5};
// 3번 수포자 찍는 방식
static final int[] guess3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
public int[] solution(int[] answers) {
int[] answer = new int[3]; // 수포자 삼인방이기에 3으로 크기 지정
for (int i = 0; i < answers.length; i++) {
// 1번 수포자가 찍어서 맞추는 경우
if (answers[i] == guess1[i % guess1.length]) {
answer[0] += 1;
}
// 2번 수포자가 찍어서 맞추는 경우
if (answers[i] == guess2[i % guess2.length]) {
answer[1] += 1;
}
// 3번 수포자가 찍어서 맞추는 경우
if (answers[i] == guess3[i % guess3.length]) {
answer[2] += 1;
}
}
// 결과물을 담을 List
List<Integer> result = new ArrayList<>();
int k = answers.length; // 문제 수(=정답 수)
while (k > 0) {
for (int i = 0; i < answer.length; i++) {
// 다 맞았을 경우부터 줄여나가면서 맞춘 갯수가 있는 경우 result에 추가
if (answer[i] == k) {
result.add(i + 1);
}
}
// 가장 많은 문제를 맞춘 사람을 구하기에 result가 비어있지 않다면 바로 탈출
if (!result.isEmpty()) {
break;
}
k--;
}
// List를 int배열로 변환
return result.stream().mapToInt(i -> i).toArray();
}
}
- int 배열로 결과를 받고 출력하는 풀이
import java.util.*;
class Solution {
// 1번 수포자 찍는 방식
static final int[] guess1 = {1, 2, 3, 4, 5};
// 2번 수포자 찍는 방식
static final int[] guess2 = {2, 1, 2, 3, 2, 4, 2, 5};
// 3번 수포자 찍는 방식
static final int[] guess3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
public int[] solution(int[] answers) {
int[] answer = new int[3]; // 수포자 삼인방이기에 3으로 크기 지정
for (int i = 0; i < answers.length; i++) {
// 1번 수포자가 찍어서 맞추는 경우
if (answers[i] == guess1[i % guess1.length]) {
answer[0] += 1;
}
// 2번 수포자가 찍어서 맞추는 경우
if (answers[i] == guess2[i % guess2.length]) {
answer[1] += 1;
}
// 3번 수포자가 찍어서 맞추는 경우
if (answers[i] == guess3[i % guess3.length]) {
answer[2] += 1;
}
}
// 결과물을 담을 int 배열
int[] result = null;
int k = answers.length; // 문제 수(=정답 수)
while (k > 0) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < answer.length; i++) {
// 다 맞았을 경우부터 줄여나가면서 맞춘 갯수가 있는 경우 list에 추가
if (answer[i] == k) {
list.add(i + 1);
}
}
result = new int[list.size()]; // list크기만큼 int배열 초기화
if (!list.isEmpty()) {
for (int i = 0; i < list.size(); i++) {
// 가장 많은 문제를 맞춘 사람을 구하기에
// list가 비어있지 않다면 result에 list값을 추가하고 탈출
result[i] = list.get(i);
}
break;
}
k--;
}
return result;
}
}
테스트 결과
- List로 결과를 받고 stream을 이용해 int배열로 변환할 경우
- int 배열로 결과를 받고 출력할 경우
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] k번째수 (0) | 2022.12.30 |
---|---|
[프로그래머스] 더 맵게 (0) | 2022.12.29 |
[프로그래머스] 기능개발 (0) | 2022.12.28 |
[프로그래머스] 완주하지 못한 선수 (0) | 2022.10.27 |