📋 문제
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
상당히 생각할 부분이 많은 문제였다
첨부터 직접 풀었다기 보단 Mr.park의 도움을 받아 하나하나 해결해가는 식으로 풀었다
그래도 어찌저찌 해결은 했으니 뿌듯
배워갈 부분이 많은 문제인듯
📋 입출력 예시

📋 풀이
import java.util.ArrayList;
class Solution {
public int[] solution(int[] answers) {
int[] num1 = {1, 2, 3, 4, 5};
int[] num2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] num3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int[] count = new int[3];
// 정답과 비교하여 각 수포자들의 맞춘 문제 수 계산
// 모듈러 연산 사용(%)
for (int i = 0; i < answers.length; i++) {
if (answers[i] == num1[i % num1.length]) {
count[0]++;
}
if (answers[i] == num2[i % num2.length]) {
count[1]++;
}
if (answers[i] == num3[i % num3.length]) {
count[2]++;
}
}
// 최대값 찾기
int max = count[0];
for(int i=0;i<count.length;i++){
if(max<count[i]){
max = count[i];
}
}
// 최대값과 같은 수포자 번호 저장
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if (count[i] == max) {
list.add(i + 1);
}
}
// ArrayList를 int[]로 변환하여 반환
int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
}
- 1,2,3번 수포자가 각각 찍는 순서에는 일정 구간 반복이 있다.
이걸 각 학생 1,2,3 변수 배열을 만들어 담아준다.
-맞는 문제 갯수를 count해주는 count배열변수도 생성. 수포자가 총 3명이니까 배열의 크기는 3
-그 다음 반복문을 하나 생성 : 수포자들이 찍은 답이 answers의 배열들과(정답) 일치하는지 순회
-모듈러 연산(%)을 사용하여 체크한다. 여기서 answers의 개수가 입출력 예시만큼만 나와있는 것이 아니기 때문에 계속 돌아갈 수 있도록 해야함

: 예를 들어 num1이 찍은 번호인 각 {1,2,3,4,5}에서 1부터 index가 0,1,2,3,4이다.
num1[i % num1.length]를 해주면 i % 5라는 뜻이 되고 저 번호를 계속 돌아가는 식으로 된다.
그리고 count[0]이 의미하는 바는 학생1이다 (i = 0부터 시작하므로)
// 최댓값 찾기
int max라는 max변수를 선언 및 초기화해준다.
일단 count 0번지의 값으로 초기화하고 count의 길이만큼 돌아가면서
count[0]으로 설정해둔 값보다 다음 인덱스가 크면 그 값으로 max에 대입하는 식으로 가장 큰 값을 도출해준다
// 최댓값과 같은 수포자 번호 저장
ArrayList를 선언. (동적배열)
그리고 반복문을 또 만들어서 count[i]번지가 max값과 같으면 list에 담아준다
(= 가장 count가 많은 학생을 찾기)
add(i+1)을 해준 이유는 i=0이고 학생은 1부터 시작하기 때문
// ArrayList를 array배열로 변환하여 반환
result라는 array int배열을 하나 만들어서 ArrayList의 크기인 list.size()만큼의 크기로 설정한다
또 그만큼 반복문을 돌려서 result배열의 인덱스에 list.get(i)으로 값을 대입한다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [Lv.1] 제일 작은 수 제거하기 (0) | 2024.08.13 |
|---|---|
| [Lv.1] 자릿수 더하기 (0) | 2024.08.12 |
| [Lv.1] 정수 제곱근 판별 (0) | 2024.08.11 |
| [Lv.0] 각도기 (0) | 2024.08.11 |
| [Lv.0] 로그인 성공? (0) | 2024.08.11 |