Code.Dev_MH
DevMHK
Code.Dev_MH
전체 방문자
오늘
어제
  • 개발자의 일상 (40)
    • Language (5)
      • Java (4)
      • Kotlin (1)
      • Python (0)
    • Back-End (1)
      • Spring (1)
      • Django (0)
      • Error (0)
    • Infra (0)
      • Docker (0)
      • CI, CD (0)
      • AWS (0)
    • CS (12)
      • 컴퓨터 구조(Computer Architectur.. (12)
      • 운영 체제(OS) (0)
      • 시스템소프트웨어(SystemSoftware) (0)
      • 네트워크(Network) (0)
      • 소프트웨어공학(Software Engineerin.. (0)
      • 데이터베이스(DataBase) (0)
      • 자료구조(Data Structure) (0)
      • 알고리즘(Algorithm) (0)
    • Git (0)
    • Algorithm (21)
      • 프로그래머스 (5)
      • 백준 (16)
      • 코딩테스트 후기 (0)
    • 회고 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Priority Queue
  • 코틀린사용이유
  • 브루트포스
  • dp
  • java
  • cs
  • 코틀린장점
  • 그리디
  • 우선순위 큐
  • BFS
  • 자바와비교
  • 너비우선탐색
  • INT
  • 다이나믹프로그래밍
  • Greedy
  • 백준
  • 제로베이스백엔드스쿨
  • 컴퓨터구조
  • computer architecture
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Code.Dev_MH

DevMHK

[프로그래머스] 모의고사
Algorithm/프로그래머스

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

2023. 1. 10. 12:00

문제

모의고사
https://programmers.co.kr/learn/courses/30/lessons/42840?language=java

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건
시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

생각해보기

  • 무조건 3명이다보니 int 크기를 3으로 잡기
  • 찍어서 정답과 일치하는 갯수를 int[]배열에 담기
  • 정답 최대 갯수부터 비교하여 일치한 것이 있다면 List or int[] 배열에 담기
  • List or int[] 가 비어있지 않다면 바로 탈출

Code

  • 수포자는 무조건 3명이고 찍는 방식이 정해져 있으므로 final로 초기화.
  • 맞은 갯수를 담을 int 배열인 answer을 만들어 크기를 3으로 지정.
  • 정답과 비교하면서 1번은 0번 index, 2번은 1번 index, 3번은 2번 index의 맞은 갯수를 answer에 담아 준다.
  • 결과물을 담을 int배열 result를 생성하고 가장 많이 맞춘 사람이 몇 명인지 모르니 초기화는 하지 않는다.
  • 모든 정답을 맞출 경우부터 확인하기 위해 k를 정답의 길이만큼 초기화.
  • while문 안에 임시로 가장 많이 맞춘 사람의 값을 담아두기 위해 list를 생성
  • while문을 통해 k가 0이 되기 전까지 돌면서 answer의 값과 k가 같다면 list에 추가
  • list size만큼 result를 초기화하고 list가 비어있지 않다면 list값을 result에 넣고 break를 통해 탈출.

)

Java

  • List로 결과를 받고 stream을 이용해 int배열로 변환한 풀이
import java.util.*;
class Solution {
    // 1번 수포자 찍는 방식
    static final int[] guess1 = {1, 2, 3, 4, 5};
    // 2번 수포자 찍는 방식
    static final int[] guess2 = {2, 1, 2, 3, 2, 4, 2, 5}; 
    // 3번 수포자 찍는 방식
    static final int[] guess3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    public int[] solution(int[] answers) {
        int[] answer = new int[3]; // 수포자 삼인방이기에 3으로 크기 지정
        for (int i = 0; i < answers.length; i++) {
            // 1번 수포자가 찍어서 맞추는 경우
            if (answers[i] == guess1[i % guess1.length]) {
                answer[0] += 1;
            }
            // 2번 수포자가 찍어서 맞추는 경우
            if (answers[i] == guess2[i % guess2.length]) {
                answer[1] += 1;
            }
            // 3번 수포자가 찍어서 맞추는 경우
            if (answers[i] == guess3[i % guess3.length]) {
                answer[2] += 1;
            }
        }

        // 결과물을 담을 List
        List<Integer> result = new ArrayList<>();
        int k = answers.length; // 문제 수(=정답 수)
        while (k > 0) {
            for (int i = 0; i < answer.length; i++) {
                // 다 맞았을 경우부터 줄여나가면서 맞춘 갯수가 있는 경우 result에 추가
                if (answer[i] == k) {
                    result.add(i + 1);
                }
            }
            // 가장 많은 문제를 맞춘 사람을 구하기에 result가 비어있지 않다면 바로 탈출
            if (!result.isEmpty()) {
                break;
            }
            k--;
        }
        // List를 int배열로 변환
        return result.stream().mapToInt(i -> i).toArray();
    }
}
  • int 배열로 결과를 받고 출력하는 풀이
import java.util.*;

class Solution {
    // 1번 수포자 찍는 방식
    static final int[] guess1 = {1, 2, 3, 4, 5};
    // 2번 수포자 찍는 방식
    static final int[] guess2 = {2, 1, 2, 3, 2, 4, 2, 5};
    // 3번 수포자 찍는 방식
    static final int[] guess3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
    public int[] solution(int[] answers) {
        int[] answer = new int[3]; // 수포자 삼인방이기에 3으로 크기 지정
        for (int i = 0; i < answers.length; i++) {
            // 1번 수포자가 찍어서 맞추는 경우
            if (answers[i] == guess1[i % guess1.length]) {
                answer[0] += 1;
            }
            // 2번 수포자가 찍어서 맞추는 경우
            if (answers[i] == guess2[i % guess2.length]) {
                answer[1] += 1;
            }
            // 3번 수포자가 찍어서 맞추는 경우
            if (answers[i] == guess3[i % guess3.length]) {
                answer[2] += 1;
            }
        }

        // 결과물을 담을 int 배열
        int[] result = null;
        int k = answers.length; // 문제 수(=정답 수)
        while (k > 0) {
            List<Integer> list = new ArrayList<>();

            for (int i = 0; i < answer.length; i++) {
                // 다 맞았을 경우부터 줄여나가면서 맞춘 갯수가 있는 경우 list에 추가
                if (answer[i] == k) {
                    list.add(i + 1);
                }
            }
            result = new int[list.size()]; // list크기만큼 int배열 초기화

            if (!list.isEmpty()) {
                for (int i = 0; i < list.size(); i++) {
                    // 가장 많은 문제를 맞춘 사람을 구하기에 
                    // list가 비어있지 않다면 result에 list값을 추가하고 탈출
                    result[i] = list.get(i);
                }
                break;
            }
            k--;
        }
        return result;
    }
}

테스트 결과

  • List로 결과를 받고 stream을 이용해 int배열로 변환할 경우

  • int 배열로 결과를 받고 출력할 경우

반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스] k번째수  (0) 2022.12.30
[프로그래머스] 더 맵게  (0) 2022.12.29
[프로그래머스] 기능개발  (0) 2022.12.28
[프로그래머스] 완주하지 못한 선수  (0) 2022.10.27
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스] k번째수
    • [프로그래머스] 더 맵게
    • [프로그래머스] 기능개발
    • [프로그래머스] 완주하지 못한 선수
    Code.Dev_MH
    Code.Dev_MH
    Back-End 개발자가 되기 위한 개발 노트(Java)

    티스토리툴바