최빈값 구하기 (자바)

김재현·2023년 9월 22일
0

알고리즘 풀이

목록 보기
2/89
post-thumbnail

프로그래머스/최빈값 구하기_자바

와아아ㅏㅇ 드디어 풀었다!!!

간단했던 덧셈을 제외하면 제대로 된 첫 문제라 할 수 있겠다.

하루 종일 이렇게 해보고 저렇게 해보고 요렇게 해보고
운동하고 해보고 밥먹고 해보고 설거지하고 해보고 샤워하고 해보다가
다른분의 도움으로 내가 테스트케이스를 잘못 입력한 것을 깨달았다.

이런저런 시도를 해보면서 무엇보다 변수 선언, for문, if문 등을 다루는 것이 익숙해졌다.

이걸 어떻게 해야하나 막막하게 바라보다가... 테스트 페이지에 직접 적는 것이 아니라 인텔리제이를 활용하여 첫째줄에 테스트케이스, 마지막줄에 따로 출력해서 오류 확인하는 방법이 좋다는걸 깨달았다.

위에서부터 설명해보자면

우선 어떻게 흐름을 짜야 할지 머리속에 그려봤다.
1. 배열이 숫자라도 순서대로 정렬되어 있으면 뭐가 좀 되겠는데 싶었고
2. 정렬된 상태에서 다음 숫자랑 비교해서 같으면 카운트를 올리면 되겠다 싶었다

위에부터 살펴보자면, 사실 처음부터 배열과 변수를 선언해놓진 않았다.
쭉 쓰다가 필요해지면 그 때 가서 위에 삽입했다.

배열을 오름차순을 쓰려면 import라는게 필요하길래 여러가지 찾아서 복붙했다.
근데 테스트페이지에는 arrays가 안먹혀서 오름차순 정리를 직접 만들었다.
--> 지금와서 생각해보니 테스트페이지에 import를 넣어주지 않았다... 다른 사람들의 풀이를 보고 깨달았다.

배열이 1개짜리 일 때는 테스트케이스를 돌려서 오류를 보고 수정했다.

2개 이상이면서 값이 동일할 때... 라는 뇌가 멈춘 희한한 사고과정을 거쳐 만들어둔 알고리즘. 테스트케이스 추가 할 때 결과를 잘못 입력해서 일어난 참사였다...

그 뒤는 앞서 생각했던 것과 똑같이 적용했으며 필요에 따라 변수나 배열을 추가했다.

마지막으로 머리속으로 점검했는데, 배열의 요소가 모두 다른 숫자일 때 알고리즘이 따로 필요 할 것이라 생각하며 max가 0인 경우 answer=-1;을 추가했다.

내 인생 첫 코딩테스트는 나에게 기나긴 희노애락의 반복을 선사해주었으나, 그만큼 알고리즘 전체를 계속해서 반복 해석하고 수정해 나가며 실력을 향상시켜주었다. 그렇지만 쓰지만 몸에 좋은 약과 같은 역할을 수행해준 '2개 이상이지만 값이 동일 할 때'라는 친구에게는 똥멍청이라는 이름을 붙여주고 싶다.
이 알고리즘의 쓴맛을 깨닫도록 도움주신 내배캠 조원분에게 매우 큰 감사의 인사를 드린다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

class Array6_3 {
public static void main(String[] args) {
int answer = 0;
int[] array = {1,1,1,2,2,2,3,3,14,14,14};

    int[] count = new int [1000];
    int max = 0;
    int index=0;


    //배열 오름차순 정렬
    for (int i=0;i<array.length;i++) {
        for (int j=i+1;j<array.length;j++){
            if (array[i]>array[j]) {
                int tmp = array[j];
                array[j] = array[i];
                array[i] = tmp;
            }
        }
    }

    //1개짜리 배열 일 때
    if (array.length==1) {
        answer=array[0];
    }


//2개 이상이면서 모든 값이 동일 할 때 라니 이거 필요 없잖아... 
//테스트케이스 정답 잘못추가
//        else if (array[0]==array[array.length-1]) {
//            answer=-1;
//        }


    else {
        //바로 앞뒤 비교해서 같으면 카운트 올린다
        for (int i=0;i<array.length-1;i++) {

            //같으면 카운트 올림
            if (array[i]==array[i+1]) {
                count[array[i]]++;

                //카운트 올린값이 최대값이면 max를 바꾸고 array[i]를 저장
                if (count[array[i]] > max) {
                    max = count[array[i]];
                    index = array[i];
                }
                //max랑 같으면 index에 -1 저장
                else if (count[array[i]]==max) {
                    index = -1;
                }
            }
        }

        //index 활용
        //모두 다르면 max가 0
        if (max==0) {
            answer=-1;
        }
        else if (max!=0) {
            answer=index;
        }


    }
    
        System.out.println(answer);
    }
}
profile
I live in Seoul, Korea, Handsome

0개의 댓글