본문 바로가기
CodingTest

[코딩테스트 JAVA] 모의고사 - stream, mapToInt(i -> i)

by KkingKkang 2025. 2. 4.
728x90

문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 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, ... => 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, ... => 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 반복

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건
시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예
answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]


입출력 예 설명
입출력 예 #1

수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

모든 사람이 2문제씩을 맞췄습니다.


1. 수포자 1, 2, 3번의 정답 패턴 배열 정리

int[] a = {1,2,3,4,5};
int[] b = {2,1,2,3,2,4,2,5};
int[] c = {3,3,1,1,2,2,4,4,5,5};

 

2. 수포자들의 정답의 갯수를 저장하는 배열 설정

int[] maxVals = new int[3];

 

3. 반복문을 통해서 수포자들이 몇개 맞춘지 알아보기

* 정답 패턴보다 문제 수가 많은 경우가 있음. 그럴때는 정답 패턴 처음으로 돌아가야 함. 

i번째 문제의 수%정답 패턴의 길이 하면 해결된다.

예를 들어, 1번째 문제 정답패턴 길이 5개 이면 1%5 = 1 이므로 첫번째 정답패턴과 비교하면 되지만

6번째 문제일 경우 정답패턴의 첫번째로 돌아가야 하는데, %를 써주면 6 % 5 = 1  이 되어서 첫번째 패턴으로 돌아갈 수 있다.

맞으면 정답 배열의 해당하는 값에 1씩 더해주면 됨.

문제 수가 끝날때까지 반복한다.

for (int i = 0; i < answers.length; i++) {
    if(answers[i] == a[i%a.length]) maxVals[0]++;
    if(answers[i] == b[i%b.length]) maxVals[1]++;
    if(answers[i] == c[i%c.length]) maxVals[2]++;
}

 

4. 최다 정답자는 몇명인지 아직 알 수 없으므로 ArrrayList를 만들어서 최대값을 가진 사람을 넣어준다.

최대값은 Math.max를 2번 써서 세명의 정답 값을 비교하여 구한다.

ArrayList<Integer> list = new ArrayList<>();
int max = Math.max(Math.max(maxVals[0], maxVals[1]),maxVals[2]);

if(max == maxVals[0]) list.add(1);
if(max == maxVals[1]) list.add(2);
if(max == maxVals[2]) list.add(3);

최대값을 가지고 있는 사람을 최다정답자 리스트에 더해주는데, 

3명밖에 없으므로 굳이 반복문을 사용하지 않아도 된다. (처음에 반복문으로 풀었다)

 

5. 정답 answer은 list 형식이다. ArrayList 를 list로 변환해보자! 

이거는 잘 몰라서 구글링했다.

int [] answer = list.stream().mapToInt(i -> i).toArray();

1. list.stream() -> Stream<Integer> 생성

- list는 ArrayList<Integer>

- list.stream() 을 호출하면 스트림 객체가 생성된다.

- 스트림은 컬렉션의 요소를 하나씩 처리할 수 있는 JAVA 8+의 함수형 프로그래밍 도구이다. 

Stream<Integer> stream = list.stream();

이제 stream 에는 list의 모든 요소가 포함된다.

 

2. mapToInt(i -> i) -> IntStream 변환

Stream<Integer>은 객체(Integer) 스트림이기 때문에 바로 int[] 배열로 변환할 수 없다. 

mapToInt(i -> i)를 사용하면 각 Integer 값을 int 로 변환하여 IntStream을 만든다. 

mapToInt(i -> i) 는 Integer을 int로 변환하는 람다 표현식이다.

여기서 i -> i는 변환 없이 값을 그대로 반환하는 함수이다.

 

3. .toArray() -> int[] 배열 생성

IntStream의 .toArray() 메서드는 모든 요소를 배열(int[])로 변환한다. 


최종 코드

import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
  int[] a = {1,2,3,4,5};
        int[] b = {2,1,2,3,2,4,2,5};
        int[] c = {3,3,1,1,2,2,4,4,5,5};
        
        int[] maxVals = new int[3];

        for (int i = 0; i < answers.length; i++) {
            if(answers[i] == a[i%a.length]) maxVals[0]++;
            if(answers[i] == b[i%b.length]) maxVals[1]++;
            if(answers[i] == c[i%c.length]) maxVals[2]++;
        }

        ArrayList<Integer> list = new ArrayList<>();
        int max = Math.max(Math.max(maxVals[0], maxVals[1]),maxVals[2]);

        if(max == maxVals[0]) list.add(1);
        if(max == maxVals[1]) list.add(2);
        if(max == maxVals[2]) list.add(3);

        int [] answer = list.stream().mapToInt(i -> i).toArray();

        return answer;
    }
}

 

728x90

댓글

낑깡코딩아옹