본문 바로가기
Programmers/Lv.1

[프로그래머스] Lv.1 모의고사 JAVA 풀이

by Poorm 푸름 2025. 5. 26.

문제 Lv.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, ...

 

시험은 최대 10,000 문제로 구성

문제의 정답은 1, 2, 3, 4, 5중 하나

가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬

 

[알고리즘 선택 이유]

모든 문제의 정답유무를 모두 파악한다 -> 완전탐색

 

 1) 정해진 패턴대로만 풀면 된다

  :  어떤거는 풀고 어떤거는 찍는게 아니라 문제 전부 다 찍을 거기 때문에 정해진 패턴에 정답만 맞춰보면 끝

 

  :  %를 활용하면 인덱스를 반복할 수 있다

 

  

[함수 1] IntStream 이용하기

  • int[], for 루프, 카운팅 등에서 더 깔끔하고 함수형 스타일로 데이터를 처리하고 싶을 때 사용
IntStream 메서드 설명
.range(start, end) start부터 end-1까지의 int 스트림 생성
.map() 각 요소 변환
.filter() 조건에 맞는 요소만 추출
.toArray() int 배열로 변환
.sum(), .max(),
.min(), .average()
통계 계산

 

 

[코드]

import java.util.*;
import java.util.stream.IntStream;

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[] score = new int[3];
        
        for(int i=0;i<answers.length;i++){
            if(answers[i]==a[i%5]){
                score[0]++;
            }
            if(answers[i]==b[i%8]){
                score[1]++;
            }
            if(answers[i]==c[i%10]){
                score[2]++;
            }
        }
        
        int maxScore = Math.max(score[0],Math.max(score[1],score[2]));
        return IntStream.range(0, 3)
                .filter(i -> score[i] == maxScore)
                .map(i -> i + 1)
                .toArray(); 
        
    }
}

[해설]

import java.util.*;
import java.util.stream.IntStream;  stream 따로 선언해줘야한다

class Solution {
    public int[] solution(int[] answers) {
        int[] a = {1,2,3,4,5};  1번 찍기 패턴
        int[] b = {2,1,2,3,2,4,2,5};  2번 찍기 패턴
        int[] c = {3,3,1,1,2,2,4,4,5,5};  3번 찍기 패턴
        
        int[] score = new int[3];  스코어 계산은 각각 하기
        
        for(int i=0;i<answers.length;i++){
            if(answers[i]==a[i%5]){  5개 인덱스 계속 반복
                score[0]++;  정답 카운트
            }
            if(answers[i]==b[i%8]){  8개 인덱스 계속 반복
                score[1]++;  정답 카운트
            }
            if(answers[i]==c[i%10]){  10개 인덱스 계속 반복
                score[2]++;  정답 카운트
            }
        }
        
        int maxScore = Math.max(score[0],Math.max(score[1],score[2]));  가장 최고 점수 뽑기

        return IntStream.range(0, 3)  범위
                .filter(i -> score[i] == maxScore)  최고 점수면 출력
                .map(i -> i + 1)  작은 인덱스 1부터 출력
                .toArray();  배열 출력
        
    }
}


 

https://school.programmers.co.kr/learn/courses/30/lessons/42840?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr