코딩테스트
[ 프로그래머스 ] 모의고사
Adose
2024. 10. 23. 22:25
📌 요구 사항 정리
- 수포자 3명마다 찍는 방식이 존재 (수포자 3명)
- 배열 answer이 주어질때, 가장 많은 문제를 맞힌 사람이 누구인지를 배열로 반환해야함
- 함수의 이름은 solution()
- 가장 높은 점수를 받은 사람(수포자)들이 여럿(중복)이 발생하면, 반환하는 값(수포자 들)을 오름차순으로 정렬
📌 제약 조건
- 시험은 최대 10,000문제
- 문제의 정답은 1, 2, 3, 4, 5 중 하나이다.
📌 문제 분석
- 수포자들의 패턴을 파악해야 한다.
- 수포자 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 반복
- answer이 주어졌을때, 수포자의 값과 answer를 비교해서 값이 같으면 정답 배열에 +1 이런식으로 저장
- 나중에 배열을 비교해서 return하면 되지 않을까 ?
- 🌟 추가 ++
- answer의 길이가 수포자의 패턴보다 길때, 수포자의 패턴의 처음 데이터와 비교할 수 있도록 해야 한다
두가지 방법으로 제출 완료
1️⃣ [ 첫번째 제출 ] - 실패
- 아래와 같은 코드를 입력했을때 실패했다.
- 무수한 런타임에러 ,,, 뭐지 ?
import java.util.*;
class Solution {
private static final int [] gvMath1 = {1, 2, 3, 4, 5};
private static final int [] gvMath2 = {2, 1, 2, 3, 2, 4, 2, 5};
private static final int [] gvMath3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
public int[] solution(int[] arr) {
int[] person = new int[4];
for (int i = 0; i < arr.length; i++) {
if (arr[i] == gvMath1[i]) {
person[1]++;
}
if (arr[i] == gvMath2[i]) {
person[2]++;
}
if (arr[i] == gvMath3[i]) {
person[3]++;
}
}
//제일 큰 값을 찾는다.
int max = Arrays.stream(person).max().getAsInt();
//return을 위한 List 생성
ArrayList<Integer> resultArr = new ArrayList<>();
for (int i = 1; i < person.length; i++) {
//제일 큰값과 수포자 정답 개수가 같으면 return값에 저장한다.
if (person[i] == max) {
resultArr.add(i);
}
}
return resultArr.stream().sorted().mapToInt(Integer::intValue).toArray();
}
}
1️⃣ [ 첫번째 제출 ] - 해결
- 해결 방법
- 위의 문제 풀이가 맞는데 왜 안될까 라는 생각에 시간 복잡도 문제인가 ? 생각했는데
- answer이 수포자들의 길이보다 더 클때, 처음부터 다시 돌아와서 값을 다시 비교하도록 해야 하는데 그걸 안했다…ㅠㅠㅠ
- 해결한 코드는 아래와 같다.
import java.util.*;
class Solution {
private static final int [] gvMath1 = {1, 2, 3, 4, 5};
private static final int [] gvMath2 = {2, 1, 2, 3, 2, 4, 2, 5};
private static final int [] gvMath3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
public int[] solution(int[] arr) {
int[] person = new int[4];
for (int i = 0; i < arr.length; i++) {
if (arr[i]==gvMath1[i%gvMath1.length]) {
person[1]++;
}
if (arr[i]==gvMath2[i%gvMath2.length]) {
person[2]++;
}
if (arr[i]==gvMath3[i%gvMath3.length]) {
person[3]++;
}
}
//제일 큰 값을 찾는다.
int max = Arrays.stream(person).max().getAsInt();
//return을 위한 List 생성
ArrayList<Integer> resultArr = new ArrayList<>();
for (int i = 1; i < person.length; i++) {
//제일 큰값과 수포자 정답 개수가 같으면 return값에 저장한다.
if (person[i] == max) {
resultArr.add(i);
}
}
return resultArr.stream().sorted().mapToInt(Integer::intValue).toArray();
}
}
2️⃣ [두번째 제출] - 해결
- 2차원 배열을 사용하여 계산을 했다.
- 첫번째 제출할때 무슨 문제인지 모르겠어서 두번째 제출 방법으로 풀다가 첫번째 코드의 문제점을 발견했다.
- answer의 값이 수포자의 패턴보다 길때, 처음 데이터로 돌아가서 다시 계산하는 부분을 넘겼다는것을 알게 되었다.
- 코드는 아래와 같다.
import java.util.*;
class Solution {
public int[] solution(int[] answer) {
int [][] gvMath ={
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] person = new int[4];
for(int i=0;i< answer.length;i++){
for(int j=0;j<gvMath.length;j++){
if(answer[i] == gvMath[j][ i % gvMath[j].length]){
person[j+1]++;
};
}
}
//제일 큰 값을 찾는다.
int max = Arrays.stream(person).max().getAsInt();
//return을 위한 List 생성
ArrayList<Integer> resultArr = new ArrayList<>();
for (int i = 1; i < person.length; i++) {
//제일 큰값과 수포자 정답 개수가 같으면 return값에 저장한다.
if (person[i] == max) {
resultArr.add(i);
}
}
return resultArr.stream().sorted().mapToInt(Integer::intValue).toArray();
}
}