[프로그래머스 - Java] 모의고사, 과일 장수

RedPanda·2025년 4월 23일
0

[알고리즘] Java

목록 보기
21/22

모의고사

문제를 찍어 맞추는 세명의 학생들 중 주어진 문제를 얼마나 많이 맞추는지 확인하는 문제이다.

풀이 방법 및 단계는 이러하다.

  1. 학생 각각의 패턴 분석 : 패턴을 분석해서 배열로 저장
  2. 문제마다 맞춘 값을 정답 배열에 추가 : (패턴의 현재 숫자 = 문제 번 수(0부터) % 학생 각각의 패턴 배열 크기)
  3. 승자 발표 : score 배열이 3개 밖에 없기 때문에 조건문으로 처리, answer의 크기는 유동적이므로(0~3) ArrayList로 처리
import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        ArrayList<Integer> answer = new ArrayList<>();
        // 1번
        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 = {0,0,0};
        // 2번
        for(int i = 0; i < answers.length; i++){
            if(a[i%5] == answers[i]) score[0]++;
            if(b[i%8] == answers[i]) score[1]++;
            if(c[i%10] == answers[i]) score[2]++;
        }
        // 3번
        if((score[0] >= score[1] && score[0] >= score[2])){   // 1이 큰 것이 확정일 경우
            answer.add(1);
        }
        if((score[1] >= score[0] && score[1] >= score[2])){   // 1이 큰 것이 확정일 경우
            answer.add(2);
        }
        if((score[2] >= score[1] && score[2] >= score[0])){   // 1이 큰 것이 확정일 경우
            answer.add(3);
        }
		// 4번
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

과일 장수

score 배열을 m개씩 쪼개서 쪼갠 요소들 중 가장 작은 크기의 값에 연산을 하는 문제이다.

문제를 푸는데 거치는 단계는 이러하다.

  1. 정렬 : 오름차순이 더 깔끔하나, Collection으로 변환하는 과정에서 성능저하
  2. score의 요소 개수 ~ m개까지 m씩 줄어들도록 순회 : 모든 사과를 확인할 필요가 없기에 상자 안의 가장 작은 사과 점수만 연산에 포함
  3. 연산 : 상자의 가장 작은 사과 점수 * 상자 안의 사과 개수
import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;
        Arrays.sort(score);

        for(int i = score.length; i >= m; i -= m){    // 상자 안의 가장 낮은 품질만 계산
            answer += score[i-m] * m;          
        }
        
        return answer;
    }
}

사실 배열 크기를 벗어나는 문제 때문에 score.length-1 부터 시작해서 연산해서 풀었는데, 어차피 연산에서 score에 -m을 하면서 m까지만 반복하기 때문에 굳이 생각하지 않아도 될 문제였다.

profile
끄적끄적 코딩일기

0개의 댓글