[JAVA] 프로그래머스 모의고사

윤재열·2022년 9월 3일
0

algorithm

목록 보기
16/18

전체코드

 //수포자 3명은 문제를 전부 찍으려고한다.
        //1번문제부터 마지막 문제까지의 정담이 순서대로 들은 배열 answers
        //가장 많은 문제를 맞힌 사람이 누구인가?
        //가장 높은 점수를 받은 사람이 여럿일 경우, 오름차순

        int[] answers =new int[]{1,2,3,4,5};



        //배열에서 중복된 패턴 찾아야함
        int[] supo1 = {1,2,3,4,5};//5
        int[] supo2 = {2,1,2,3,2,4,2,5};//8
        int[] supo3 = {3,3,1,1,2,2,4,4,5,5};//10

        List<Integer> correctList = new ArrayList<>();//맞춘리스트
        for(int i=1; i <= 3; i++){
            correctList.add(0);//맞춘사람 리스트에 1,2,3 에 0씩 부여
        }

        for(int i=0; i<answers.length; i++){
            if(answers[i] == supo1[i%5]){
                correctList.set(0, correctList.get(0)+1);
            }
            if(answers[i] == supo2[i%8]){
                correctList.set(1, correctList.get(1)+1);
            }
            if(answers[i] == supo3[i%10]){
                correctList.set(2, correctList.get(2)+1);
            }
        }

        Integer max = Collections.max(correctList);
        System.out.println(max);
        List<Integer> returnList  = new ArrayList<>();
        for(int i=1; i<= correctList.size(); i++){
            if(max == correctList.get(i-1)){
                returnList.add(i);
            }
        }
        int[] answer = new int[returnList.size()];
        for(int i=0; i< returnList.size(); i++){
            answer[i] = returnList.get(i);
        }
        System.out.println(Arrays.toString(answer));

10,11,12 테스트 코드 에러

  • Collections. max(correctList) 의 타입을 Integer로 하니 10,11,12 부분에서 에러가 발생 하였습니다.

문제점

  • Integer 객체 간 비교에 >.< 같은 비교 연산자는 사용이 가능하지만, 동등 연산자인 (==) 경우에는 Integer 객체의 주소값을 비교 하게 되어 문제가 발생하였습니다.
  • Integer 객체 간 값 비교를 할때는 equals() 메서드를 사용해야 합니다.

문제 해결 방법

Sol 1

  • eqauls 메서드를 사용하지 않고, == 연산자를 사용했음에도 불구하고 3개를 제외한 테스트는 통과하였습니다.
    Integer에는 -128 ~ 127 까지는 캐시를 이용하여 자동으로 같은 주소를 참조하게 하는 IntegerCache라는 클래스가 선언 되어 있습니다.
  • 예를들어 Integer a = 100; , Integer b = 100; 으로 초기화한다면 IntegerCache로 인해 b변수를 선언하고 초기화 할 때 -128 ~ 127 사이의 수 중 이미 존재하는 객체가 있는지 확인하고 있을 경우 그 객체에 b를 연결만 시켜줌을 통해 같은 값을 지닌 중복 객체 생성을 생략합니다.
  • 즉 100에 대한 객체는 이미 a를 초기화할때 생겼으므로 b는 a와 같은 객체를 참조하기만 하면 됩니다.결과적으로 a와 b는 같은 객체를 참조해 객체의 값 100과 객체의 주소값을 모두 공유하게 됩니다.
  • 그래서 이 같은 경우에는 객체의 값을 비교하는 equals메서드와 객체의 주소값을 비교하는 == 동등연산자가 같은 결과를 반환하게 됩니다.

Sol 2

  • 예를 들어 Integer a = 128; Integer b =128; 일 경우에는 a를 초기화할 때 분명히 128값의 객체를 생성했음에도 불구하고 128이 IntegerCache의 범위 밖이여서 b를 초기화 할때는 새로운 128값의 객체를 또 만들게 됩니다.
  • 이 경우에는 a와 b가 참조하는 객체들의 값은 128 로 같지만, 참조하고 있는 객체 자체는 달라서 a와 b는 그저 같은 값을 가진 서로 다른 객체이므로 equals 메서드를 사용해야 합니다.

Sol 3

  • 각 패턴별 정답회수가 127 이하인 경우에는 IntegerCache를 통해 같은 주소값을 고융해 == 동등연산자로 비교해도 equals 메서드와 같은결과를 얻었지만, 패턴별 정답횟수가 128 이상인 경우는 IntegerCache의 영향을 받지 않아 같은 정답횟수를 자겨도 == 동등연산자로 비교하면 equals 메서드와 다른 결과를 얻어 문제가 발생하였습니다.
int max = Collections.max(correctList);
  • 위와 같이 바꿔준다면 모든 테스트가 통과 됩니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글

관련 채용 정보