문제
[완전탐색]
https://school.programmers.co.kr/learn/courses/30/lessons/42840
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해설
import java.util.stream.IntStream;
class Solution {
private static final int[][] RULES = {
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
public int[] solution(int[] answers) {
// 수포자들의 찍기 규칙 배열
// RULES[0]: 1번 수포자, RULES[1]: 2번 수포자, RULES[2]: 3번 수포자
int[] corrects = new int[3]; // 각 수포자의 정답 개수를 저장하는 배열
int max = 0; // 가장 많이 맞힌 정답 개수
// 문제당 정답 체크
for (int problem = 0; problem < answers.length; problem++) {
int answer = answers[problem];
// 각 수포자의 찍기 규칙에 따라 정답을 비교하고 정답 개수 업데이트
for (int person = 0; person < 3; person++) {
int index = problem % RULES[person].length; // 현재 문제에 대한 찍기 인덱스
int picked = RULES[person][index]; // 현재 수포자가 찍은 정답
if (picked == answer && ++corrects[person] > max) {
max = corrects[person]; // 가장 많이 맞힌 정답 개수 업데이트
}
}
}
final int maxCorrects = max; // 람다식에서 사용하기 위해 max를 final 변수로 저장
// 최대 정답 개수를 가진 수포자들의 번호를 반환
return IntStream.range(0, 3)
.filter(i -> corrects[i] == maxCorrects)
.map(i -> i + 1) // 인덱스(0-based)를 번호(1-based)로 변환
.toArray();
}
}
- final int maxCorrects = max;
- maxCorrects를 final로 선언
- 람다 혹은 익명 메서드로 전달되는 메서드에서 외부 변수를 참조할 때는 해당 변수값을 수정하면 안됨
- 따라서, final 키워드를 붙여 값이 수정되지 않는다는 것을 명시
IntStream
IntStream.range(0, 3) // 0부터 2까지의 정수 스트림을 생성
.filter(i -> corrects[i] == maxCorrects) // 가장 많이 맞힌 정답 개수와 일치하는 수포자 필터링
.map(i -> i + 1) // 인덱스(0-based)를 번호(1-based)로 변환
.toArray(); // 배열로 변환하여 반환
- IntStream.range(0,3): 0부터 2까지의 정수를 IntStream으로 생성
- filter(i -> corrects[i] == maxCorrects) : filter 연산 사용
- corrects 배열에서 maxCorrects와 같은 결과값을 가지는 i 필요
반응형
'study > 코딩테스트' 카테고리의 다른 글
[프로그래머스][Lv0][Java] x사이의 개수 (1) | 2024.02.28 |
---|---|
[프로그래머스][Lv3][Java] 여행경로 (0) | 2024.01.25 |
[프로그래머스][Lv2][Java] 카펫 (0) | 2023.12.28 |
[프로그래머스][Lv2][Java] H-Index (0) | 2023.12.28 |
[프로그래머스][Lv1][Java] 두 개 뽑아서 더하기 (0) | 2023.12.28 |