[JAVA] [LEVEL1] 프로그래머스 - 모의고사

반응형

프로그래머스 programmers Level1 모의고사 - java

[문제]

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

[풀이]

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...

  → 5개 반복
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
  → 8개 반복
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
  → 10개 반복

각각 5개, 8개, 10개의 답안을 순서대로 반복하여 찍는다.
・1번 수포자 user1 = {1, 2, 3, 4, 5}
・2번 수포자 user2 = {2, 1, 2, 3, 2, 4, 2, 5}
・3번 수포자 user3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
즉 각각의 답안 순서는 위 배열이 반복되는 것이다.
정답이 들어있는 배열  answers  의 원소가 수포자의 배열(답안 순서)의 몇번째에 해당하는지를 찾으면 된다.

예를들어,  answers = [1, 2, 3, 4, 5, 2, 4, 4, 5, 2, 2, 1, 3, 2, 5, 1, 3, 2, 4]  일때 15번의 정답은 5이다.
즉,  answers[14] = 5  이고, 각 수포자 값은 다음과 같다.
・1번 수포자는 15번 답으로 5로 찍는다.
・2번 수포자는 15번 답으로 2로 찍는다.
・3번 수포자는 15번 답으로 2를 찍는다.


이때 각 수포자의 답안user1, user2, user3 배열의 몇번째 값인지(인덱스)를 판별해야한다.
・1번 수포자는 5개씩 반복하므로 인덱스가 0, 1, 2, 3, 4 가 반복된다.
 인덱스를 5로 나누면 그 나머지 값이 0, 1, 2, 3, 4 가 반복된다.
・2번 수포자는 8개씩 반복하므로 인덱스가 0, 1, 2, 3, 4, 5, 6, 7 이 반복된다.
 인덱스를 8로 나누면 그 나머지 값이 0, 1, 2, 3, 4, 5, 6, 7 이 반복된다.
・3번 수포자는 10개씩 반복하므로 10으로 나누고 그 나머지 값이 반복된다.

따라서, 정답 배열  answers  의 원소를 for문으로 확인하면서 각 수포자의 답과 비교하면 된다.

  1. 각 수포자의 찍는 순서를 배열로 선언한다.
  2. 각 수포자가 맞춘 답의 개수를 담을 변수를 선언한다.
    ※ 답안에는 int[] 배열을 사용하여 선언했다. 각각의 int 변수 3개 선언해도 된다. 
  3. 정답배열  answers  의 원소를 for문으로 확인한다.
    3.1. 인덱스를 5로 나눈 나머지값으로 정답인지 확인하여 정답이면 카운트 해준다.
    3.2. 인덱스를 8로 나눈 나머지값으로 정답인지 확인하여 정답이면 카운트 해준다.
    3.3. 인덱스를 10으로 나눈 나머지값으로 정답인지 확인하여 정답이면 카운트 해준다.
  4. 3명의 정답 개수 중 가장 높은 정답을 찾는다.
  5. 가장 높은 점수를 받은 사람이 여럿인지 확인한다.
  6. 오름차순 정렬하여 리턴한다.

 

[java 코드]

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

public int[] solution(int[] answers) {
    int[] answer = {};
    // 1번 수포자
    int[] user1 = {1, 2, 3, 4, 5};
    // 2번 수포자
    int[] user2 = {2, 1, 2, 3, 2, 4, 2, 5};
    // 3번 수포자
    int[] user3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

    int[] count = new int[3];
    for (int i = 0; i < answers.length; i++) {
        if (answers[i] == user1[i % 5]) {
            count[0]++;
        }
        if (answers[i] == user2[i % 8]) {
            count[1]++;
        }
        if (answers[i] == user3[i % 10]) {
            count[2]++;
        }
    }
    // 가장 높은 점수
    int max = Math.max(count[0], Math.max(count[1], count[2]));
    // 높은 점수 동점자 확인
    List<Integer> result = new ArrayList<>();
    for (int i = 0; i < count.length; i++) {
        if (max == count[i]) {
            result.add(i + 1);
        }
    }
    // 오름차순 정렬
    answer = result.stream().sorted().mapToInt(Integer::intValue).toArray();
    return answer;
}
반응형