문제설명
입력 & 출력
나의 풀이
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] answer = {};
int[] scores = new int[3];
int[] supo1 = {1,2,3,4,5};
int[] supo2 = {2,1,2,3,2,4,2,5};
int[] supo3 = {3,3,1,1,2,2,4,4,5,5};
for(int i = 0 ; i < answers.length ; i++){
if(answers[i] == supo1[i % supo1.length]){
scores[0]++;
}
if(answers[i] == supo2[i % supo2.length]){
scores[1]++;
}
if(answers[i] == supo3[i % supo3.length]){
scores[2]++;
}
}
int max = Math.max(scores[0],Math.max(scores[1],scores[2]));
List<Integer> list = new ArrayList<>();
for(int i = 0 ; i < scores.length ; i++){
if(max == scores[i]){
list.add(i+1);
}
}
return list.stream().mapToInt(x -> x.intValue()).toArray();
}
}
이번 문제는 3명의 수학 포기자(수포자) 중에서 어떠한 사람이 가장 높은 점수를 받았는지 체크하고 가장 높은 점수를 받은 수포자를 배열로 반환해야 하는 문제입니다.
먼저 수포자들의 답안을 보면 반복되는 수열입니다. 해당 수열에 맞춰서 배열을 생성해 줍니다.
그리고 for문에서 각 수포자들의 점수를 체크합니다. 이때 앞에서 각 수포자들의 점수를 저장할 배열 scores를 생성했습니다. 초기 값은 0이기 때문에 정답과 같을 경우에 각 배열의 요소를 늘려줍니다.
- i = 0:0 % 5 = 0 ➡️ 패턴의 첫 번째 요소 (supo1 [0] = 1)
- i = 1:1 % 5 = 1 ➡️ 패턴의 두 번째 요소 (supo1 [1] = 2)
- i = 2:2 % 5 = 2 ➡️ 패턴의 세 번째 요소 (supo1 [2] = 3)
- i = 3:3 % 5 = 3 ➡️ 패턴의 네 번째 요소 (supo1 [3] = 4)
- i = 4:4 % 5 = 4 ➡️ 패턴의 다섯 번째 요소 (supo1 [4] = 5)
- i = 5:5 % 5 = 0 ➡️ 다시 패턴의 첫 번째 요소 (supo1 [0] = 1)
- i = 6:6 % 5 = 1 ➡️ 다시 패턴의 두 번째 요소 (supo1 [1] = 2)
❗️이때 주어진 answers 배열의 길이가 supo 배열들의 길이보다 클 수 있기 때문에 나머지 연산자를 사용하여 조절해줘야 합니다.
그러면 각 수포자들의 점수가 scores배열에 저장되게 됩니다.
그리고 입출력 예 #2처럼 가장 높은 점수를 받은 수포자가 다수일 수 있기 때문에 Math.max() 메서드를 사용하여 3명의 수포자들의 가장 높은 점수를 구합니다.
그리고 가장 높은 점수를 맞은 수포자들이 몇 명인지 알 수 없기 때문에 길이를 동적으로 조절하기 위하여 ArrayList 클래스를 사용하여 리스트를 만들고 max값과 비교 후 가장 높은 점수를 받은 수포자들을 구해줍니다.
최종 리턴값은 배열입니다. 따라서 ArrayList ➡️ Array로 변환을 해줘야 합니다.
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
위와 같이 반복문을 사용해도 되지만 Stream API을 사용할 수 있습니다.
- list.stream() ➡️ Stream <Integer> 객체를 반환합니다.
- mapToInt() ➡️ 스트림의 각 요소를 int로 매핑하여 IntStream을 생성합니다.
- x -> x.intValue() ➡️ Integer 객체의 intValue() 메서드를 참조하여 각 Integer 객체를 기본형 int로 변환합니다.
- 람다식 : x -> x.intValue()
- 메서드 참조 : Integer::intValue
- toArray() ➡️ IntStream의 모든 요소를 새로운 int []로 반환하는 역할
참고❗️
[Algorithm] 완전 탐색, 브루트 포스: 가장 단순한 알고리즘(Brute Force) 알아보기
한 사람이 단어를 생각하고 다른 사람이 그 단어를 추측하는 만약 "단어 맞추기" 게임을 한다면 추측하는 사람은 가능한 모든 단어를 시도하여 맞출 때까지 계속합니다. 예를 들어 추측하는 사
pixx.tistory.com
[JAVA] ArrayList 알아보기 (동적 배열)
Java에서는 기본적으로 여러 데이터를 다룰 때 배열을 사용합니다. 그러나 배열은 정적이므로, 한 번 생성되면 크기를 변경할 수 없습니다. 배열은 처리할 데이터의 개수가 정해진 경우에 유용
pixx.tistory.com
[JAVA] Stream API에 대해 알아보기 _ Stream 중간 연산(가공) (3/5)
Stream의 객체를 구성하고자 할 때 "Stream 생성 → 중간 연산→ 최종 연산"의 세 단계의 과정을 통해서 Stream의 구성이 이루어집니다. 이번 포스팅에서는 Stream 생성 후 생성된 스트림을 필터링하
pixx.tistory.com
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.1 과일 장수 (sort, Java) (0) | 2024.09.23 |
---|---|
[프로그래머스] Lv.3 네트워크 (DFS/BFS, Java) (0) | 2024.07.04 |
[프로그래머스] Lv.2 큰 수 만들기 (Greedy 알고리즘 , 탐욕, ,StringBuilder, Java) (0) | 2024.06.17 |
[프로그래머스] Lv.1 구명보트 (Greedy 알고리즘, Java) (0) | 2024.06.17 |
[프로그래머스] Lv.2 H-Index (Arrays.sort(), Java) (1) | 2024.06.16 |