[프로그래머스] 14 : 모의고사 완전 탐색 | 소수 만들기

서예진·2024년 1월 26일
0

목차 💻

▸ 모의고사 완전 탐색
▸ 소수만들기


💡 모의고사 완전 탐색 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 완전탐색 > 모의고사

▼ 내 풀이

  • 향상된 for문을 사용하고 정답을 맞췄을 때 count++하는 방식으로 접근했다.
  • 각 수포자의 정답 패턴에 맞추어 answers 배열을 수정한다.
  • 각 수포자마다 정답과 답을 비교하여 맞은 문제 수를 count++한다.
  • 마지막으로, 맞힌 문제 수를 비교하여 많이 맞힌 수포자를 찾아내는 로직을 세웠다.
  • 맞힌 문제 수를 비교하여 많이 맞춘 수포자의 배열을 만드는 과정에서 시간이 오래걸렸다.
[오답코드]
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

class Solution {
    public int[] solution(int[] answers) {
        List<Integer> result = new ArrayList<>();
        int correct1 = 0;
        int correct2 = 0;
        int correct3 = 0;
        List<Integer> answerList1 = new ArrayList<>();
        List<Integer> answerList2 = new ArrayList<>();
        List<Integer> answerList3 = new ArrayList<>();
        
        //수포자들의 정답 리스트
        int[] answer1 = {1, 2, 3, 4, 5};
        int[] answer2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] answer3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        
        //answers 배열 수정
        List<Integer> answerList = new ArrayList<>();
        for(int i = 0; i < answers.length; i++){
            answerList.add(answers[i]);
        }
        answerList.addAll(answerList);
        
        for (int i = 0; i < answer1.length; i++){
            answerList1.add(answerList.get(i));
        }
        for (int i = 0; i < answer2.length; i++){
            answerList2.add(answerList.get(i));
        }
        for (int i = 0; i < answer3.length; i++){
            answerList3.add(answerList.get(i));
        }
        
        
        //1번 수포자
        for(int i = 0; i < answerList1.size(); i++){
            if(answerList1.get(i) == answer1[i]){
                correct1 ++;
            }
        }
        
        //2번 수포자
        for(int i = 0; i < answerList2.size(); i++){
            if(answerList2.get(i) == answer2[i]){
                correct2 ++;
            }
        }
        
        //3번 수포자
        for(int i = 0; i < answerList3.size(); i++){
            if(answerList3.get(i) == answer3[i]){
                correct3 ++;
            }
        }
        
        //맞힌 문제 수 비교
        int[] correctnumber = {correct1, correct2, correct3};
        int max = correctnumber[0];
        for(int i = 1; i < correctnumber.length; i++){
            if(max <= correctnumber[i]){
                max = correctnumber[i];
                result.add(i+1);
            }
        }
        if(result.size()==0){
            result.add(1);
        }
        if(max == correct2 && max == correct3){
            result.add(1);
        }
        Collections.sort(result);
        
        //리스트 -> 배열
        int resultsize = result.size();
        int[] answer = new int[resultsize];
        for(int i = 0; i<resultsize; i++){
            answer[i] = result.get(i);
        }
        return answer;
    }
}
  • 이렇게 해서 작성한 코드를 제출하니 테스트 케이스에서는 통과했지만 모든 테스트에서 실패를 얻었다,,
  • 따라서, 각 수포자들이 제출한 정답과 실제 정답을 비교하는 부분을 수정하고자 했다.
  • 아무래도 각 수포자들의 답 패턴에 맞추어 answerw 배열을 수정하는 접근 방식이 잘못된 접근 방식이였던 것 같다.
  • 또한 answers의 수가 5개만 존재한다고 착각했던 것 같다. 따라서 5개 이상일 때도 고려해야한다. 각 수포자들로 패턴이 정해져있기 때문에 나눗셈의 나머지를 index로 하여 접근하면 된다.
[수정 코드]
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] answers) {
        
        //수포자들의 정답 배열과 실제 맞힌 수의 배열
        int[] answer1 = {1, 2, 3, 4, 5};
        int[] answer2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] answer3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int[] answer = {0, 0, 0};
        
        //정답과 비교 ⭐️
        for(int i = 0; i < answers.length; i++){
            if(answers[i] == answer1[i%5]){
                answer[0]++;
            }
            if(answers[i] == answer2[i%8]){
                answer[1]++;
            }
            if(answers[i] == answer3[i%10]){
                answer[2]++;
            }
        }
        
        //최댓값 찾기
        int max = answer[0];
        for(int i =1; i < answer.length; i++){
            if(max < answer[i]){
                max = answer[i];
            }
        }
        
        //최댓값과 동일한 수포자 리스트 생성
        List<Integer> answerpeople = new ArrayList<>();
        for(int i = 0; i < answer.length; i++){
            if(max==answer[i]){
                answerpeople.add(i+1);
            }
        }
        
        //리스트 -> 배열
        int [] result = new int[answerpeople.size()];
        for(int i = 0; i < result.length; i++){
            result[i] = answerpeople.get(i);
        }
        return result;
    }
}

⭐️ 주의 ⭐️

패턴이 정해진 수의 배열에 접근하기 위해서는 나눗셈을 활용한 index를 통해서 접근한다.


💡 소수 만들기 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > Summer/Winter Coding(~2018) > 소수 만들기

▼ 내 풀이

  • 우선, 주어진 숫자 배열에서 3개의 숫자 조합을 만들어 각 조합별 합을 구한다.
  • 3개의 숫자 조합을 구하는 게 문제라고 생각했다.
  • for문을 활용하여 3개의 숫자 조합 및 조합의 합을 구했고 해당 합이 소수인지 판별한다.
import java.util.List;
import java.util.ArrayList;

class Solution {
    public int solution(int[] nums) {
        int count = 0;
        List<Integer> answerList = new ArrayList<>();
        List<Integer> sumList = new ArrayList<>();
        
        
        // 3개의 숫자 조합별 합 구하기
        for(int i = 0; i< nums.length-2; i++){
            for(int j = i+1; j< nums.length-1; j++){
                for(int k = j+1; k<nums.length; k++){
                    int sum = nums[i] + nums[j] + nums[k];
                    sumList.add(sum);
                    
                    //sum이 소수인지 판별
                    boolean isPrime = true;
                    for(int h = 2; h < sum; h++){
                        if(sum%h == 0){
                            isPrime = false;
                        }
                    }
                    if(isPrime){
                        count++;
                        answerList.add(sum);
                    }
                }
            }
        }

        return count;
    }
}
profile
안녕하세요

0개의 댓글