문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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번 문제부터 마지막 문제까지 정답이 순서대로 들은 배열 answer가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return 하는 값을 오름차순 정렬해주세요.
입출력 예
answer | return |
[1, 2, 3, 4, 5] | [1] |
[1, 3, 2, 4, 2] | [1, 2, 3] |
import java.util.ArrayList;
class Solution {
public int[] solution(int[] answers) {
int[] one = {1, 2, 3, 4, 5};
int[] two = {2, 1, 2, 3, 2, 4, 2, 5};
int[] three = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int oneA = 0;
int twoA = 0;
int threeA = 0;
for (int i = 0; i < answers.length; i++) {
if (answers[i] == one[i % one.length]) {
oneA++;
}
if (answers[i] == two[i % two.length]) {
twoA++;
}
if (answers[i] == three[i % three.length]) {
threeA++;
}
}
int[] arr = {oneA, twoA, threeA};
ArrayList<Integer> list = new ArrayList<>();
int max = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
list.clear();
max = arr[i];
list.add(i + 1);
} else if (arr[i] == max) {
list.add(i + 1);
}
}
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
배열 one, two, three를 생성합니다. 이는 각 수포자가 문제를 찍는 방식을 배열에 담은 것입니다.
변수 oneA, twoA, threeA를 생성합니다. 이는 각 수포자가 문제를 맞힌 개수를 의미합니다.
for문이 answers의 길이만큼 순회합니다.
첫 번째 if문에서 answers의 i번째 원소가 one의 i를 one의 길이로 나눈 나머지 번째 원소와 같다면 oneA가 증가합니다.
두 번째 if문에서 answers의 i번째 원소가 two의 i를 two의 길이로 나눈 나머지 번째 원소와 같다면 twoA가 증가합니다.
세 번째 if문에서 answers의 i번째 원소가 three의 i를 three의 길이로 나눈 나머지 번째 원소와 같다면 threeA가 증가합니다. i를 배열의 길이만큼 나누는 이유는 answer 배열의 길이가 각 수포자의 배열의 길이보다 길 수 있기 때문입니다.
배열 arr를 생성하여 각 수포자의 점수를 담습니다.
ArrayList를 생성합니다. answer 배열의 크기가 모호하기 때문입니다. 최고점과 동일한 점수를 받은 수포자가 있을 수 있습니다.
최고점을 담을 변수 max를 생성합니다.
for문이 arr의 길이만큼 순회합니다.
if문에서 arr의 i 번째 원소가 max보다 크다면 clear 메소드를 이용하여 list를 초기화합니다.
max를 arr의 i 번째 원소로 갱신합니다.
i + 1을 리스트에 추가합니다. i + 1은 수포자의 번호를 의미합니다. 배열의 인덱스는 0부터 시작하므로 1을 더해주었습니다.
else if에서 arr의 i번째 원소가 max와 동일하다면 최고점과 동일한 점수를 받은 학생이라는 뜻입니다. 따라서 add 메소드를 이용하여 i + 1을 추가합니다.
앞서 구한 ArrayList를 Array로 복사하는 일만 남았습니다. answer 배열의 크기를 list의 size로 지정합니다.
for문이 list의 size만큼 순회합니다.
answer의 i 번째 원소에 list의 i 번째 원소를 할당합니다.
'프로그래머스 > Lv. 1' 카테고리의 다른 글
[프로그래머스 코딩테스트] 소수 만들기(Java) (0) | 2023.07.08 |
---|---|
[프로그래머스 코딩테스트] 최소 직사각형(Java) (0) | 2023.07.07 |
[프로그래머스 코딩테스트] 비밀지도(Java) (0) | 2023.06.29 |
[프로그래머스 코딩테스트] 가장 가까운 같은 글자(Java) (0) | 2023.06.26 |
[프로그래머스 코딩테스트] 이상한 문자 만들기(Java) (0) | 2023.06.14 |