티스토리 뷰
[ 프로그래머스 ] 모의고사 ( 자바 )
3명의 학생이 시험에서 어떤 답을 규칙에 따라 찍는다. 정답 배열이 주어졌을때 가장 많이 맞춘 학생(들) 배열을 리턴하기
https://programmers.co.kr/learn/courses/30/lessons/42840
구조
// 모든 답에 대해, i
// 답 == 1학생[ i % 1번길이 ]
// cnt1++;
// 답 == 2학생[ i % 2번길이 ]
// cnt2++;
// 답 == 3학생[ i % 3번길이 ]
// cnt3++;
// 가장 많은 cnt인 학생들, int[] 담아서 리턴
핵심
1 반복하는 수열과 배열의 일치
수열 [ a1, a2, a3 ] , 배열 [ b1, b2, b3, b4, b5, b6 ,, ]
b1 | b2 | b3 | b4 | b5 | b6 |
a1 | a2 | a3 | a1 | a2 | a3 |
0 | 1 | 2 | 3 | 4 | 5 |
위 표처럼 확인하며 검사해야되는데, 검사는 실제 배열을 가리키는 인덱스를 시용하여 검사한다.
수열은 반복적으로 매칭하는데 인덱스가 대신 반복해서? 가리킬 수 있다.
'수열 인덱스 = (배열인덱스 % 수열길이)' 로 하면 배열인덱스는 그냥 쭉 검사하는 동시에 수열 인덱스를 범위 초과없이 검사할 수 있게 된다.
2 가장 많이 맞춘 학생(들)
1번은 대부분 동일한데 이부분에서 조금 다양함
1 max, 가장 많이 맞춘 개수를 찾는다.
2 일일히 모든 학생들과 max를 비교해서 max와 동일한 학생들 리턴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// 최대
int largest = Math.max(Math.max(cnt1, cnt2), cnt3);
ArrayList<Integer> ans = new ArrayList<Integer>();
// 최대와 같은 애들 추가
if(cnt1 == largest) {
ans.add(1);
}
if(cnt2 == largest) {
ans.add(2);
}
if(cnt3 == largest) {
ans.add(3);
}
// int[] 배열로 만들어서 리턴
int[] ans2 = new int[ans.size()];
for(int i = 0 ; i < ans.size() ; i++) {
ans2[i] = ans.get(i);
}
|
cs |
또는
굳이 arraylist 객체 생성은 안해도 되지만 실수할 확률이 좀 될듯.
1
2
3
4
5
6
7
8
9
10
11
|
// 최대
int largest = Math.max(Math.max(cnt1, cnt2), cnt3);
// arraylist없이 바로 답 생성 후 리턴
// 최대와 같은 애들 추가
if(max == arr[0] && max == arr[1] && max == arr[2]) return new int[]{1,2,3};
else if(max == arr[0] && max == arr[1]) return new int[]{1,2};
else if(max == arr[0] && max == arr[2]) return new int[]{1,3};
else if(max == arr[1] && max == arr[2]) return new int[]{2,3};
else if(max == arr[0]) return new int[]{1};
else if(max == arr[1]) return new int[]{2};
|
cs |
2 소팅
이차원 배열 소팅, 제일 먼저 맞은 개수를 기준으로 소팅한다. 하지만 같다면, 값이 낮은 사람을 기준으로 소팅. 그리고 답 계산
최종 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] p1 = {1,2,3,4,5};
int[] p2 = {2,1,2,3,2,4,2,5};
int[] p3 = {3,3,1,1,2,2,4,4,5,5};
int cnt1= 0, cnt2=0, cnt3=0;
for(int i = 0 ; i < answers.length ; i++) {
if(answers[i] == p1[i%p1.length]) {
cnt1++;
}
if(answers[i] == p2[i%p2.length]) {
cnt2++;
}
if(answers[i] == p3[i%p3.length]) {
cnt3++;
}
}
int largest = Math.max(Math.max(cnt1, cnt2), cnt3);
ArrayList<Integer> ans = new ArrayList<Integer>();
if(cnt1 == largest) {
ans.add(1);
}
if(cnt2 == largest) {
ans.add(2);
}
if(cnt3 == largest) {
ans.add(3);
}
int[] ans2 = new int[ans.size()];
for(int i = 0 ; i < ans.size() ; i++) {
ans2[i] = ans.get(i);
}
return ans2;
}
}
|
cs |
'CS > 알고리즘 풀이' 카테고리의 다른 글
[ 백준 17837 ] 새로운 게임 2 (java) (0) | 2019.12.01 |
---|---|
[ 프로그래머스 ] 체육복 ( java ) (0) | 2019.11.26 |
[ 프로그래머스 ] 완주하지 못한 선수 ( java ) (0) | 2019.11.23 |
[ 프로그래머스- 2020카카오 공채 ] 문자열 압축 (java) (2) | 2019.11.23 |
[ 백준 14503 ] 로봇청소기 (java) (0) | 2019.11.11 |
- Total
- Today
- Yesterday
- 오블완
- 짝지어 제거하기
- 2019 카카오 공채
- 2018 카카오 공채
- 찾아라 프로그래밍 마에스터
- 게리맨더링 2
- 후보키
- 백준
- 티스토리챌린지
- 괄호 변환
- 큰 수 만들기
- 프로그래머스
- programmers
- 17825
- 주사위 윷놀이
- 정수 내림차순으로 배치하기
- 문자열을 정수로 바꾸기
- DP
- 단체사진 찍기
- 라면공장
- 카카오2020 공채
- java
- 자바
- 투포인터
- Brainf**k 인터프리터
- 가장 큰 정사각형 찾기
- 17779
- 3954
- 카카오 2020 공채
- 124 나라의 숫자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |