- [프로그래머스 / JAVA] Level 2 메뉴 리뉴얼 (72411)
- [프로그래머스 / JAVA] Level 2 행렬 테두리 회전하기 (77485)
- [프로그래머스 / JAVA] Level 2 짝지어 제거하기 (12973)
- [프로그래머스 / MySQL] Level 2 루시와 엘라 찾기 (59046)
- [프로그래머스 / MySQL] Level 2 고양이와 개는 몇 마리 있을까 (59040)
- [프로그래머스 / JAVA] Level 2 타겟 넘버 (43165)
- [프로그래머스 / JAVA] Level 2 더 맵게 (42626)
- [프로그래머스 / JAVA] Level 2 기능개발 (42586)
- [프로그래머스 / JAVA] Level 2 124 나라의 숫자 (12899)
- [프로그래머스 / JAVA] Level 2 멀쩡한 사각형 (62048)
- [프로그래머스 / JAVA] Level 2 단체사진 찍기 (1835)
- [프로그래머스 / JAVA] Level 2 카카오프렌즈 컬러링북 (1829)
- [프로그래머스 / JAVA] Level 2 오픈채팅방 (42888)
- [프로그래머스 / JAVA] Level 2 문자열 압축 (60057)
- [프로그래머스 / JAVA] Level 1 직사각형 별찍기 (12954)
- [프로그래머스 / JAVA] Level 1 x만큼 간격이 있는 n개의 숫자 (12954)
- [프로그래머스 / JAVA] Level 1 행렬의 덧셈 (12950)
- [프로그래머스 / JAVA] Level 1 핸드폰 번호 가리기 (12948)
- [프로그래머스 / JAVA] Level 1 하샤드 수 (12947)
- [프로그래머스 / JAVA] Level 1 평균 구하기 (12944)
- [프로그래머스 / JAVA] Level 1 콜라츠 추측 (12943)
- [프로그래머스 / JAVA] Level 1 최대공약수와 최소공배수 (12940)
- [프로그래머스 / JAVA] Level 1 짝수와 홀수 (12937)
- [프로그래머스 / JAVA] Level 1 제일 작은 수 제거하기 (12935)
- [프로그래머스 / JAVA] Level 1 정수 제곱근 판별 (12934)
- [프로그래머스 / JAVA] Level 1 정수 내림차순으로 배치하기 (12933)
- [프로그래머스 / JAVA] Level 1 자연수 뒤집어 배열로 만들기 (12932)
- [프로그래머스 / JAVA] Level 1 자릿수 더하기 (12931)
- [프로그래머스 / JAVA] Level 1 이상한 문자 만들기 (12930)
- [프로그래머스 / JAVA] Level 1 약수의 합 (12928)
- [프로그래머스 / JAVA] Level 1 시저 암호 (12926)
- [프로그래머스 / JAVA] Level 1 문자열을 정수로 바꾸기 (12925)
- [프로그래머스 / JAVA] Level 1 수박수박수박수박수박수? (12922)
- [프로그래머스 / JAVA] Level 1 소수 찾기 (12921)
- [프로그래머스 / JAVA] Level 1 서울에서 김서방 찾기 (12919)
- [프로그래머스 / JAVA] Level 1 문자열 다루기 기본 (12918)
- [프로그래머스 / JAVA] Level 1 문자열 내림차순으로 배치하기 (12917)
- [프로그래머스 / JAVA] Level 1 문자열 내 p와 y의 개수 (12916)
- [프로그래머스 / JAVA] Level 1 문자열 내 마음대로 정렬하기 (12915)
- [프로그래머스 / JAVA] Level 1 두 정수 사이의 합 (12912)
- [프로그래머스 / JAVA] Level 1 나누어 떨어지는 숫자 배열 (12910)
- [프로그래머스 / JAVA] Level 1 같은 숫자는 싫어 (12906)
- [프로그래머스 / MySQL] Level 1 상위 n개 레코드 (59405)
- [프로그래머스 / JAVA] Level 1 다트 게임 (17682)
- [프로그래머스 / MySQL] Level 1 여러 기준으로 정렬하기 (59404)
- [프로그래머스 / JAVA] Level 1 가운데 글자 가져오기 (12903)
- [프로그래머스 / JAVA] Level 1 비밀지도 (17681)
- [프로그래머스 / JAVA] Level 1 부족한 금액 계산하기 (82612)
- [프로그래머스 / MySQL] Level 1 동물의 아이디와 이름 (59403)
- [프로그래머스 / JAVA] Level 1 나머지가 1이 되는 수 찾기 (87389)
- [프로그래머스 / JAVA] Level 1 최소직사각형 (86491)
- [프로그래머스 / MySQL] Level 1 어린 동물 찾기 (59037)
- [프로그래머스 / JAVA] Level 1 2016년 (12901)
- [프로그래머스 / MySQL] Level 1 아픈 동물 찾기 (59036)
- [프로그래머스 / JAVA] Level 1 두 개 뽑아서 더하기 (68644)
- [프로그래머스 / MySQL] Level 1 이름이 있는 동물의 아이디 (59407)
- [프로그래머스 / JAVA] Level 1 두 개 뽑아서 더하기 (12982)
- [프로그래머스 / JAVA] Level 1 예산 (12982)
- [프로그래머스 / JAVA] Level 1 3진법 뒤집기 (68935)
- [프로그래머스 / JAVA] Level 1 약수의 개수와 덧셈 (77884)
- [프로그래머스 / JAVA] Level 1 실패율 (42889)
- [프로그래머스 / JAVA] Level 1 폰켓몬 (1845)
- [프로그래머스 / MySQL] Level 1 이름이 없는 동물의 아이디 (59039)
- [프로그래머스 / MySQL] Level 1 최댓값 구하기 (59415)
- [프로그래머스 / MySQL] Level 1 모든 레코드 조회하기 (59034)
- [프로그래머스 / JAVA] Level 1 체육복 (42862)
👀 [프로그래머스 / JAVA] Level 1 모의고사 (42840)
- [프로그래머스 / JAVA] Level 1 완주하지 못한 선수 (42576)
- [프로그래머스 / JAVA] Level 1 소수 만들기 (12977)
- [프로그래머스 / JAVA] Level 1 음양 더하기 (76501)
- [프로그래머스 / JAVA] Level 1 K번째수 (42748)
- [프로그래머스 / JAVA] Level 1 내적 (70128)
- [프로그래머스 / JAVA] Level 1 없는 숫자 더하기 (86051)
- [프로그래머스 / JAVA] Level 1 크레인 인형뽑기 게임 (64061)
- [프로그래머스 / JAVA] Level 1 키패드 누르기 (67256)
- [프로그래머스 / JAVA] Level 1 숫자 문자열과 영단어 (81301)
- [프로그래머스 / JAVA] Level 1 신규 아이디 추천 (72410)
- [프로그래머스 / JAVA] Level 1 로또의 최고 순위와 최저 순위 (77484)
모의고사 🔗
🔗 모의고사
문제 설명 🔗
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
입출력 예 🔗
answers | return |
---|---|
{ 1, 2, 3, 4, 5 } | { 1 } |
{ 1, 3, 2, 4, 2 } | { 1, 2, 3 } |
입출력 예 설명 🔗
입출력 예 #1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
- 모든 사람이 2문제씩을 맞췄습니다.
풀이 🔗
- 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 ]
수포자마다 패턴도 다르고, 길이도 달라서 생각없이 접근할 순 없다. 각 패턴의 길이가 다르므로 인덱스 방식은 적절하지 않다. 패턴을 컨테이너 벨트처럼 순환시켜, 가장 앞 쪽의 숫자를 비교하는 것이 더 효과적일 것이다.
이를 위해선 각 수포자별로 패턴을 순환시키는 로직이 필요하다. [ 1, 2, 3, 4, 5 ]
-> [ 2, 3, 4, 5, 1 ]
자료구조 중 큐의 특성과 매우 유사하므로, 이 문제는 큐를 적극적으로 활용해볼 생각이다.
각 패턴을 정의할 큐 ONE
, TWO
, THREE
가 있으며, 아래와 같이 초기화를 수행한다.
JAVA
0 | private void initQueue() |
1 | { |
2 | ONE.clear(); |
3 | TWO.clear(); |
4 | THREE.clear(); |
5 | |
6 | ONE.add(1); |
7 | ONE.add(2); |
8 | ONE.add(3); |
9 | ONE.add(4); |
10 | ONE.add(5); |
11 | |
12 | TWO.add(2); |
13 | TWO.add(1); |
14 | TWO.add(2); |
15 | TWO.add(3); |
16 | TWO.add(2); |
17 | TWO.add(4); |
18 | TWO.add(2); |
19 | TWO.add(5); |
20 | |
21 | THREE.add(3); |
22 | THREE.add(3); |
23 | THREE.add(1); |
24 | THREE.add(1); |
25 | THREE.add(2); |
26 | THREE.add(2); |
27 | THREE.add(4); |
28 | THREE.add(4); |
29 | THREE.add(5); |
30 | THREE.add(5); |
31 | } |
패턴 순서대로 큐에 데이터를 집어넣는다. poll()
메서드를 통해 가장 앞에 위치한 데이터를 꺼낼 수 있다. poll()
의 경우 데이터 호출과 동시에 데이터가 삭제된다.
정답 비교 후, 사용한 데이터는 다시 큐에 집어넣는다. 이런 구조는 문제의 길이에 관계없이 각 수포자 별로 지속적인 순환이 가능할 것이다.
JAVA
0 | for (int item : answers) |
1 | { |
2 | int one = Objects.requireNonNull(ONE.poll()); |
3 | int two = Objects.requireNonNull(TWO.poll()); |
4 | int three = Objects.requireNonNull(THREE.poll()); |
5 | |
6 | counts[0] += item == one ? 1 : 0; |
7 | counts[1] += item == two ? 1 : 0; |
8 | counts[2] += item == three ? 1 : 0; |
9 | |
10 | ONE.add(one); |
11 | TWO.add(two); |
12 | THREE.add(three); |
13 | } |
정답 비교는 위와 같다. Objects.requireNonNull
는 poll()
이 NullPointerException
을 유발할 가능성이 있으므로, 관련 경고를 제거하기 위한 조치다.
각 수포자별 큐에서 패턴을 뽑고, 이를 문제의 정답과 비교하여 맞춘 경우 counts
배열에 카운팅한다.
사용한 패턴은 add
메서드를 통해 큐에 다시 집어넣는 것을 확인할 수 있다.
점수를 모두 구했다면, 가장 고득점을 구하고, 고득점을 맞은 수포자를 반환하면 된다.
counts
에서 가장 큰 값을 구하면 아래와 같다.
JAVA
0 | int max = Arrays.stream(counts).max().getAsInt(); |
이후 max
에 해당하는 점수를 받은 모든 인원을 탐색하여 배열로 나타내면 된다.
코드 🔗
JAVA
0 | import java.util.ArrayList; |
1 | import java.util.Arrays; |
2 | import java.util.LinkedList; |
3 | import java.util.Objects; |
4 | import java.util.Queue; |
5 | |
6 | /** |
7 | * 모의고사 클래스 |
8 | * |
9 | * @author RWB |
10 | * @since 2021.12.10 Fri 21:43:26 |
11 | */ |
12 | class Solution |
13 | { |
14 | private static final Queue<Integer> ONE = new LinkedList<>(); |
15 | private static final Queue<Integer> TWO = new LinkedList<>(); |
16 | private static final Queue<Integer> THREE = new LinkedList<>(); |
17 | |
18 | /** |
19 | * 해답 반환 메서드 |
20 | * |
21 | * @param answers: [int[]] 최고 득점자 |
22 | * |
23 | * @return [int[]] 해답 |
24 | */ |
25 | public int[] solution(int[] answers) |
26 | { |
27 | initQueue(); |
28 | |
29 | int[] counts = { 0, 0, 0 }; |
30 | |
31 | for (int item : answers) |
32 | { |
33 | int one = Objects.requireNonNull(ONE.poll()); |
34 | int two = Objects.requireNonNull(TWO.poll()); |
35 | int three = Objects.requireNonNull(THREE.poll()); |
36 | |
37 | counts[0] += item == one ? 1 : 0; |
38 | counts[1] += item == two ? 1 : 0; |
39 | counts[2] += item == three ? 1 : 0; |
40 | |
41 | ONE.add(one); |
42 | TWO.add(two); |
43 | THREE.add(three); |
44 | } |
45 | |
46 | int max = Arrays.stream(counts).max().getAsInt(); |
47 | |
48 | ArrayList<Integer> list = new ArrayList<>(); |
49 | |
50 | for (int i = 0; i < counts.length; i++) |
51 | { |
52 | // 최고 점수를 얻었을 경우 |
53 | if (counts[i] == max) |
54 | { |
55 | list.add(i + 1); |
56 | } |
57 | } |
58 | |
59 | return list.stream().mapToInt(Integer::intValue).toArray(); |
60 | } |
61 | |
62 | /** |
63 | * 큐 초기화 메서드 |
64 | */ |
65 | private void initQueue() |
66 | { |
67 | ONE.clear(); |
68 | TWO.clear(); |
69 | THREE.clear(); |
70 | |
71 | ONE.add(1); |
72 | ONE.add(2); |
73 | ONE.add(3); |
74 | ONE.add(4); |
75 | ONE.add(5); |
76 | |
77 | TWO.add(2); |
78 | TWO.add(1); |
79 | TWO.add(2); |
80 | TWO.add(3); |
81 | TWO.add(2); |
82 | TWO.add(4); |
83 | TWO.add(2); |
84 | TWO.add(5); |
85 | |
86 | THREE.add(3); |
87 | THREE.add(3); |
88 | THREE.add(1); |
89 | THREE.add(1); |
90 | THREE.add(2); |
91 | THREE.add(2); |
92 | THREE.add(4); |
93 | THREE.add(4); |
94 | THREE.add(5); |
95 | THREE.add(5); |
96 | } |
97 | } |
📆 작성일
2021-12-14 Tue 13:02:01
📚 카테고리
🏷️ 태그