프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/42840
완전탐색(모의고사)
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 함수를 작성하라.
3명의 답안지를 String혹은 배열을 통해 입력받는다.
정답지와 답안지를 비교하여 각 답안지마다 맞은 점수를 기록한다.
가장 많이 문제를 맞힌 사람이 누구인지 찾아내 배열에 담아 출력한다.
🚫 제한조건
int[] user1 = {1,2,3,4,5};
int[] user2 = {2,1,2,3,2,4,2,5};
int[] user3 = {3,3,1,1,2,2,4,4,5,5};
int[] temp = {0,0,0}; // 결과 저장할 배열
for (int i = 0; i < answers.length; i++) {
if(answers[i] == user1[i%user1.length])
temp[0]++;
if(answers[i] == user2[i%user2.length])
temp[1]++;
if(answers[i] == user3[i%user3.length])
temp[2]++;
}
예) user1 = {1,2,3,4,5} 은 총 5개의 답안지로 반복이 되고 5개의 답만 저장이 되어있다 만약 {1,2,3,4,5,6,7} 총 7문제가 입력이 되어 있다면 7번문제에 해당하는 답안지를 구하기 위해서는 6%5[user1 길이] = 1의 식을 통해 user1의 index 1번째의 값 2와 비교를 하게 된다.
int max = Math.max(temp[0], Math.max(temp[1],temp[2])); // 3개의 값 중 최대값 저장
List<Integer> maxScore = new ArrayList<>();
// 최대값이 중복일 경우 리스트에 추가해줌
for(int i=0; i<temp.length; i++){
if(max == temp[i])
maxScore.add(i+1);
}
Math.max( )
를 사용하여// List => Arrays
int[] result = new int[maxScore.size()];
for(int i =0; i<maxScore.size(); i++){
result[i] = maxScore.get(i);
}
String answerPattern1 = "12345".repeat(2000);
String answerPattern2 = "21232425".repeat(1250);
String answerPattern3 = "3311224455".repeat(1000);
// 각 사람마다 작성한 답안지를 채점함
// 답이 맞으면 결과 배열의 값을 1씩 증가함
for (int i = 0; i < answers.length; i++) {
if(Character.getNumericValue(answerPattern1.charAt(i)) == answers[i]) count[0] ++;
if(Character.getNumericValue(answerPattern2.charAt(i)) == answers[i]) count[1] ++;
if(Character.getNumericValue(answerPattern3.charAt(i)) == answers[i]) count[2] ++;
}
charAt( )
을 통해 한자리씩 자르고 Character.getNumbericValue( )
를 통해 Char ⇒ int 로 바꿔서 비교할 수 있도록 하였다.// 중복 비교
List<Integer> maxscorelist = new ArrayList<>();
int maxscore = Math.max(count[0],Math.max(count[1], count[2]));
for(int i=0; i<count.length; i++){
if(maxscore == count[i]){ // 최대값이 count배열의 안에 있는 값과 같을시
maxscorelist.add(i+1); // list에 i번째의 자리를 넣어야 하는데 배열은 0부터 시작이므로 +1하여 넣는다
}
}
// list -> int[]
int[] result = maxscorelist.stream()
.mapToInt(Integer::intValue)
.toArray();
return result;
int[] arr = list.stream().mapToInt(i -> i).toArray();
Strem( ).mapToInt( )
메서드가 있다(1) Stream목록에서 가져오기
(2) IntStream각 요소를 자체에 매핑하여 각 Integer객체가 보유한 값을 unboxing하여 획득
(3) int 호출하여 배열얻기 toArray
public class SearchFull {
public int[] solution(int[] answers) {
int[] user1 = {1,2,3,4,5};
int[] user2 = {2,1,2,3,2,4,2,5};
int[] user3 = {3,3,1,1,2,2,4,4,5,5};
int[] temp = {0,0,0};
for (int i = 0; i < answers.length; i++) {
if(answers[i] == user1[i%user1.length])
temp[0]++;
if(answers[i] == user2[i%user2.length])
temp[1]++;
if(answers[i] == user3[i%user3.length])
temp[2]++;
}
int max = Math.max(temp[0], Math.max(temp[1],temp[2])); // 3개의 값 중 최대값 저장
List<Integer> maxScore = new ArrayList<>();
// 최대값이 중복일 경우 리스트에 추가해줌
for(int i=0; i<temp.length; i++){
if(max == temp[i])
maxScore.add(i+1);
}
// List => Arrays
int[] result = new int[maxScore.size()];
for(int i =0; i<maxScore.size(); i++){
result[i] = maxScore.get(i);
}
return result;
}
public static void main(String[] args) {
SearchFull sf = new SearchFull();
int[] answers = {1,3,2,4,2,1,4};
System.out.println(Arrays.toString(sf.solution(answers)));
}
}
public class SearchFull2 {
public int[] solution(int[] answers) {
String answerPattern1 = "12345".repeat(2000);
String answerPattern2 = "21232425".repeat(1250);
String answerPattern3 = "3311224455".repeat(1000);
// 공간복잡도로 속도를 높이는 방법
int[] count = {0,0,0};
// 각 사람마다 작성한 답안지를 채점함
// 답이 맞으면 결과 배열의 값을 1씩 증가함
for (int i = 0; i < answers.length; i++) {
if(Character.getNumericValue(answerPattern1.charAt(i)) == answers[i]) count[0] ++;
if(Character.getNumericValue(answerPattern2.charAt(i)) == answers[i]) count[1] ++;
if(Character.getNumericValue(answerPattern3.charAt(i)) == answers[i]) count[2] ++;
}
// 중복 검사
List<Integer> maxscorelist = new ArrayList<>();
int maxscore = Math.max(count[0],Math.max(count[1], count[2]));
for(int i=0; i<count.length; i++){
if(maxscore == count[i]){ // 최대값이 count배열의 안에 있는 값과 같을시
maxscorelist.add(i+1); // list에 i번째의 자리를 넣어야 하는데 배열은 0부터 시작이므로 +1하여 넣는다
}
}
// list -> int[]
int[] result = maxscorelist.stream()
.mapToInt(Integer::intValue)
.toArray();
return result;
}
}
class SearchFull2Test {
@Test
@DisplayName("제일많이 맞춘사람 1명일때")
void onecheck(){
SearchFull2 sf = new SearchFull2();
int[] answers = {1,2,3,4,5};
assertEquals("[1]",Arrays.toString(sf.solution(answers)));
}
@Test
@DisplayName("제일많이 맞춘사람 1명 이상 일때")
void twocheck(){
SearchFull2 sf = new SearchFull2();
int[] answers2 = {1,3,2,4,2};
assertEquals("[1, 2, 3]",Arrays.toString(sf.solution(answers2)));
}
}
시험 답
첫번째 답 : {1,2,3,4,5}
두번째 답 : {1,3,2,4,2}