728x90
코딩테스트 연습 - 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는
programmers.co.kr
문제 설명
수포자는 수학을 포기한 사람의 준말입니다.
수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.
수포자는 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
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
|
private void solution(int[] answerList) {
// 수포자 패턴 리스트 3개로 처리필요성 체크
int[] supojaList1 = new int[]{1, 2, 3, 4, 5};
int[] supojaList2 = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
int[] supojaList3 = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
// 2차원 배열로 처리시 생기는 문제점?(식별성)
int[][] supojaList = new int[][]{
supojaList1, // 0
supojaList2, // 1
supojaList3 // 2
};
// 정답 건수 처리할 해쉬맵 생성
HashMap<Integer,Integer> answerCntHM = new HashMap<Integer,Integer>();
// 답안지 길이만큼 도는 OUTER FOR
for(int i = 0 ; i < answerList.length ; i++){ // 0~N
// 수포자 답안지 길이만큼 도는 INNER FOR
for(int j = 0 ; j < supojaList.length ; j++){ // 0, 1, 2
// 답안지의 배열에서 수포자 J의 답을 비교하여 같은지 검사하는 IF
if(answerList[i] == supojaList[j][i%supojaList[j].length]) {
// 해쉬맵에 넣는다. (단, 같은 키값 존재시 +1 처리하여 정답 건수 체크)
answerCntHM.put(j, answerCntHM.getOrDefault(j,0) + 1);
}
}
}
// 해쉬맵 콘솔로그 출력
System.out.println(answerCntHM);
// 해쉬맵 사이즈 만큼 랭크 배열 생성
int[] ranks = new int[answerCntHM.size()];
// 랭크 길이만큼 도는 for
for(int i = 0 ; i < ranks.length ; i ++){
// 랭크 처리
ranks[i] = ( answerCntHM.get(i) == answerCntHM.get(i-1) ) ? i+1 : i+1;
}
}
|
cs |
2차 시도... (1차 시도 후 약 3시간 30분 소요)
첫번째 작성한 소스가 발가락으로 짰다고 치면..
드디어? 손으로 짠것같은... 소스가 나왔다..
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
private int[] solution(int[] answerList) {
int[] answer;
// 수포자 패턴 생성
int[] pattern1 = new int[]{1, 2, 3, 4, 5};
int[] pattern2 = new int[]{2, 1, 2, 3, 2, 4, 2, 5};
int[] pattern3 = new int[]{3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
// 2차원 패턴 배열 생성
int[][] patternList = new int[][]{
pattern1, // 0
pattern2, // 1
pattern3 // 2
};
// 패턴리스트의 길이만큼 점수 리스트 생성
int[] jumsu = new int[patternList.length];
// 정답리스트만큼 수행하는 for
for(int i = 0 ; i < answerList.length ; i++){
// ★ 처리해야하는 패턴이 많아지면 하기 하드코딩한 숫자값(0, 1, 2)들을 처리하는 inner for 구현
// 1번 패턴 정답 확인 후 점수 카운트 ++
if(answerList[i] == patternList[0][i%patternList[0].length]) {
jumsu[0]++;
}
// 2번 패턴 정답 확인 후 점수 카운트 ++
if(answerList[i] == patternList[1][i%patternList[1].length]) {
jumsu[1]++;
}
// 3번 패턴 정답 확인 후 점수 카운트 ++
if(answerList[i] == patternList[2][i%patternList[2].length]) {
jumsu[2]++;
}
}
// 랭크 처리할 리스트 생성
ArrayList<Integer> rankList = new ArrayList<Integer>();
// ★ 여기도 마찬가지로 개선 필요할 것 같음.
// 가장 높은 점수 체크
int max = jumsu[0];
// if( max < jumsu[0]) max = jumsu[0]; // 0으로 초기화 되어 생성되기 때문에 MAX값에 0번값으로 초기 세팅으로 변경
if( max < jumsu[1]) max = jumsu[1];
if( max < jumsu[2]) max = jumsu[2];
// 점수 배열만큼 도는 for
for(int i=0; i < jumsu.length ; i++) {
// 점수배열에서 얻은 값이 가장 높은 점수인경우
if (jumsu[i] == max){
// 리스트에 담는다.
rankList.add(i+1);
}
}
// 랭크 처리 후 수포자 번호 리턴세팅
answer = new int[rankList.size()];
int idx = 0;
for(int test : rankList){
answer[idx++] = test;
}
return answer;
}
|
cs |
깔끔하게 처리 완료.
728x90
'Programmers > Level1' 카테고리의 다른 글
[Programmers Level1] 가운데 글자 가져오기 정답 및 문제 풀이 (0) | 2021.04.30 |
---|---|
[Programmers Level1] 문자열 내 p와 y의 개수 정답 및 문제 풀이 (0) | 2021.04.29 |
[Programmers Level1] 신규 아이디 추천 정답 및 풀이 설명 카카오 블라인드 공개채용 문제 (0) | 2021.04.28 |
[Programmers Level1] 완주하지 못한 선수 정답 및 풀이 설명 (0) | 2021.04.26 |
[Programmers Level1] 크레인 인형뽑기 게임 정답 및 풀이 설명 (0) | 2021.04.23 |