99클럽 코테 스터디 20일차 TIL

2024. 11. 16. 16:37·코딩테스트/99클럽 4기

프로그래머스 - 모의고사

먼저 수포자마다 문제를 찍는 규칙을 정리해야 한다.

1번 1, 2, 3, 4, 5
2번 2, 1, 2, 3, 2, 4, 2, 5
3번 3, 3, 1, 1, 2, 2, 4, 4, 5, 5
int[] rules1 = {1, 2, 3, 4, 5};
int[] rules2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] rules3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

주어진 문제의 정답과 각각의 규칙을 비교하면서 맞힌 개수를 세야 하는데,

규칙마다 개수가 달라 문제의 수가 많은 경우, ArrayIndexOutOfBoundsException이 발생할 수 있다.

 

문제를 모두 비교할 때까지 규칙의 사이클이 돌 수 있도록 따로 인덱스를 설정해줘야 한다.

문제 개수를 기준으로 반복문이 돌 때마다 규칙 전용 인덱스값을 증가시키고,

인덱스가 각 규칙의 개수에 도달하면 0으로 초기화해 준다.

int[] scores = new int[3];

int idx1 = 0, idx2 = 0, idx3 = 0; // 각 규칙의 전용 인덱스
for (int i = 0; i < answers.length; i++) {
    if (answers[i] == rules[idx1]) scores[0]++;
    if (answers[i] == rules[idx2]) scores[1]++;
    if (answers[i] == rules[idx3]) scores[2]++;

    idx1++;
    idx2++;
    idx3++;

    if (idx1 == rules1.length) idx1 = 0;
    if (idx2 == rules2.length) idx2 = 0;
    if (idx3 == rules3.length) idx3 = 0;
}

여기까지 코드를 작성하고 scores를 출력해 보면, 수포자마다 문제를 맞힌 개수가 출력된다.

  • 첫 번째 입출력 : [5, 0 , 0]
  • 두 번째 입출력 : [2, 2, 2]

scores에서 가장 큰 값(max)을 구하고, 반복문을 돌면서 max와 같은 값 즉, 문제를 가장 많이 맞힌 수포자를 찾아 배열에 저장한다.

수포자마다 문제를 맞힌 갯수가 동일하다면 모두 저장한다.

int max = Math.max(scores[0], Math.max(scores[1], scores[2]));
List<Integer> answer = new ArrayList<>();
for (int i = 0; i < scores.length; i++) {
    if (scores[i] == max) answer.add(i + 1);
}

맞힌 갯수가 동일한 경우, 오름차순으로 정렬해서 출력해야 한다.

하지만 이미 1번부터 순차적으로 저장되었기 때문에 따로 정렬해주지 않아도 된다. 

 

최종 코드

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<Integer> solution(int[] answers) {
        int[] rules1 = {1, 2, 3, 4, 5};
        int[] rules2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] rules3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int[] scores = new int[3];
        int idx1 = 0, idx2 = 0, idx3 = 0;
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == rules1[idx1]) scores[0]++;
            if (answers[i] == rules2[idx2]) scores[1]++;
            if (answers[i] == rules3[idx3]) scores[2]++;

            idx1++;
            idx2++;
            idx3++;

            if (idx1 == rules1.length) idx1 = 0;
            if (idx2 == rules2.length) idx2 = 0;
            if (idx3 == rules3.length) idx3 = 0;
        }

        int max = Math.max(scores[0], Math.max(scores[1], scores[2]));
        List<Integer> answer = new ArrayList<>();
        for (int i = 0; i < scores.length; i++) {
            if (scores[i] == max) answer.add(i + 1);
        }

        return answer;
    }
}

기존 문제의 반환 타입은 int []이지만 List로 설정해도 통과할 수 있다.

만약 문제 반환 타입인 int []로 하게 된다면 int []의 크기 초기화, 값 매핑과 관련된 코드를 추가해줘야 한다.

int[] result = new int[answer.size()];
for (int i = 0; i < result.length; i++) {
    result[i] = answer.get(i);
}

return result;

굳이 필요하지 않은 작업이라 생각하여 반환타입을 List로 변경하여 제출했다.


프로그래머스 - 모의고사

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

저작자표시 (새창열림)

'코딩테스트 > 99클럽 4기' 카테고리의 다른 글

99클럽 코딩 테스트 22일차 TIL  (1) 2024.11.18
99클럽 코테 스터디 21일차 TIL  (0) 2024.11.17
99클럽 코테 스터디 19일차 TIL  (1) 2024.11.15
99클럽 코테 스터디 18일차 TIL  (2) 2024.11.14
99클럽 코테 스터디 17일차 TIL  (0) 2024.11.13
'코딩테스트/99클럽 4기' 카테고리의 다른 글
  • 99클럽 코딩 테스트 22일차 TIL
  • 99클럽 코테 스터디 21일차 TIL
  • 99클럽 코테 스터디 19일차 TIL
  • 99클럽 코테 스터디 18일차 TIL
tjdgus
tjdgus
  • tjdgus
    Do It...
    tjdgus
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Language
        • Java
      • CS
        • Data Structure
        • OS
        • Algorithm
        • Network
      • 오류 모음집
      • ETC
      • 함수형 프로그래밍
      • JPA
      • Toy
      • 데이터베이스
      • Spring
      • 코딩테스트
        • 99클럽 4기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트준비
    오블완
    99클럽
    TiL
    항해99
    개발자취업
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
tjdgus
99클럽 코테 스터디 20일차 TIL
상단으로

티스토리툴바