[프로그래머스/42840] 모의고사
in Study / Coding Test
☑️ 문제
☑️ 풀이
과정
- 각 수포자의 정답 패턴을 정의한다.
- 정답 배열과 비교하여 각 수포자의 점수를 계산한다.
- 최고 점수를 구하고, 해당 점수를 받은 사람을 리스트에 저장한다.
- 결과를 배열로 변환하여 리턴한다.
첫 번째 풀이
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] score = new int [3];
// 수포자들의 찍는 방식을 담은 2차원 배열
int[][] sheet = {{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
int max = 0;
// 문제를 맞춘 개수를 구하는 과정
for (int i = 0; i < sheet.length; i++) {
for (int j = 0; j < answers.length; j++) {
if (answers[j] == sheet[i][j % sheet[i].length]) {
score[i] += 1;
}
}
// 가장 높은 점수 구하기
if (max < score[i]) {
max = score[i];
}
}
// 가장 높은 점수와 동일한 점수가 있다면 리스트에 수포자 번호 추가
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if (score[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;
}
}
나머지 연산을 통해 수포자들의 점수를 비교했다.
if (answers[j] == sheet[i][j % sheet[i].length])
최고 점수를 구할 때는 Math.max를 사용하면 더 간편할 거 같다.
max = Math.max(max, score[i]);
두 번째 풀이 (Stream 사용)
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] score = new int [3];
// 수포자들의 찍는 방식을 담은 2차원 배열
int[][] sheet = {{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
// 문제를 맞춘 개수를 구하는 과정
for (int i = 0; i < sheet.length; i++) {
for (int j = 0; j < answers.length; j++) {
if (answers[j] == sheet[i][j % sheet[i].length]) {
score[i] += 1;
}
}
}
int max = Arrays.stream(score).max().getAsInt();
// 가장 높은 점수와 동일한 점수가 있다면 리스트에 인덱스 추가
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
if (score[i] == max) {
list.add(i + 1);
}
}
// 리스트를 배열로 변경
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
가장 높은 점수는 Stream을 사용해서 쉽게 구할 수 있다.
int max = Arrays.stream(score).max().getAsInt();
수포자의 번호를 담은 리스트를 배열로 변경할 때도 Stream을 사용하면 된다.
return list.stream().mapToInt(Integer::intValue).toArray();
시간 복잡도
- sheet를 돌면서 순회할 때 수포자의 수는 항상 3이므로 항상 O(1)
- 내부 반복문에서 정답과 패턴을 비교할 때는 answers.length만큼 연산하기 때문에 O(N)
- 최종 시간 복잡도는 O(N)