코딩테스트 사이트 : 프로그래머스
난이도 : 1단계
풀이 날짜 : 2022.06.29
사용한 풀이 방법 : 완전탐색
https://programmers.co.kr/learn/courses/30/lessons/42840
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] one = {1,2,3,4,5};
int[] two = {2,1,2,3,2,4,2,5};
int[] three = {3,3,1,1,2,2,4,4,5,5};
int oneIndex = 0;
int twoIndex = 0 ;
int threeIndex = 0;
int oneCount= 0;
int twoCount =0;
int threeCount=0 ;
int max = 0;
for(int i =0 ; i< answers.length; i++){
oneIndex = i % one.length;
twoIndex = i % two.length;
threeIndex = i % three.length;
if(answers[i] == one[oneIndex]){
oneCount++;
}
if(answers[i] == two[twoIndex]){
twoCount++;
}
if(answers[i] == three[threeIndex]){
threeCount++;
}
}
max = Math.max(Math.max(oneCount, twoCount),threeCount);
List<Integer> list = new ArrayList<>();
if(max == oneCount){
list.add(1);
}
if(max == twoCount){
list.add(2);
}
if(max == threeCount){
list.add(3);
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[][] select = {{1,2,3,4,5},{2,1,2,3,2,4,2,5},{3,3,1,1,2,2,4,4,5,5}};
int[] index = {0,0,0};
int[] count = {0,0,0};
int max = 0;
for(int i =0 ; i< answers.length; i++){
for(int j = 0 ; j< 3; j++){
index[j] = i % select[j].length;
if(answers[i] == select[j][index[j]]){
count[j]++;
}
}
}
max = Arrays.stream(count).max().getAsInt();
List<Integer> list = new ArrayList<>();
for(int j = 0 ; j< 3; j++){
if(max == count[j]){
list.add(j+1);
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
먼저 가장 빨리 수정할 수 있는 Stream() 연산부터 건들렸다.
max = Arrays.stream(count).max().getAsInt();
코드를
max = Math.max(Math.max(count[0], count[1]),count[2]);
으로 수정하고 실행해주었더니,
확실히 2차제출보다는 시간이 빨라졌다.
오히려 1차 제출했을때 보다, 빠른 부분도 생겨났다. (앞쪽 테스트는 빨라졌으나, 뒤쪽 테스트는 느리다.)
먼저 다른사람이 푼것 중에 빠른 코드를 찾아 보았다.
죄다 1초도 안되는 상태로 테스트를 통과하였다.(감탄쓰..)
그래서 코드를 보니 아래와 같다.
import java.util.*;
class Solution {
public static int[] solution(int[] answers) {
int[][] patterns = { //이중 배열
{1, 2, 3, 4, 5},
{2, 1, 2, 3, 2, 4, 2, 5},
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}
};
int[] hit = new int[3];
for(int i = 0; i < hit.length; i++) {
for(int j = 0; j < answers.length; j++) {
if(patterns[i][j % patterns[i].length] == answers[j]) hit[i]++;
}
}
int max = Math.max(hit[0], Math.max(hit[1], hit[2]));
List<Integer> list = new ArrayList<>();
for(int i = 0; i < hit.length; i++)
if(max == hit[i]) list.add(i + 1);
int[] answer = new int[list.size()];
int cnt = 0;
for(int num : list)
answer[cnt++] = num;
return answer; //Stream 연산을 안함.
}
}
수포자 3명을 2차배열에 넣어줬고, 정답을 맞은 갯수도 배열로 선언해줬으나, index같은 경우는 그냥 그때그때 배열에서 계산한 값을 넣어주는 모습이 보인다.
게다가 최대값에서 동점자를 파악하는 부분은 List를 통해 추가해주며,
그 List의 길이에 맞춰 배열을 생성해주고 값을 넣어,
List -> int[] 변환 작업을 반복문으로 해버린다.