현재 내 실력으로는 최빈값 구하는 문제를 풀 수 없을 것 같아 미뤄 두었었는데, 아침에 뒤척이며 고민하다 갑자기 풀이법이 떠올라서 풀이를 작성하게 되었다.
나머지 문제들은 전부 쉬운 문제들이다. 매일 순서대로 제공하는 문제를 다 풀어버려 앞으로는 정답률이 높은 순으로 풀게 되었기 때문이다. 따라서 최빈값 구하는 문제를 제외한 오늘 푼 문제들은 남은 문제들 중 가장 쉽다. 이 문제들은 포스팅이 너무 길어져 다음 포스팅으로 넘겼다.
최빈값 구하기
척 보기에도 쉽지 않다. 최빈값을 골라내야 하는 것은 물론이고, 최빈값이 여러 개일 경우 또 다르게 -1을 return해야 한다. 원래 내 실력으로 불가능해 보였는데, 조잡하지만 해결 가능한 풀이가 떠올라서 적어 보았다.
설계는 이렇다.
1. for i문으로 array 전체를 한 번씩 훑으면서 그 안에서 for j문으로 array[i] = j 인 수를 찾는다.
2. 같은 수를 찾을 때마다 frequencyCount를 하나씩 추가한다.
3. 같은 수를 다 찾은 후에 frequencyCount가 finalCount보다 크면 finalCount를 그 수로 대체한다. 즉, 더 많이 중복된 값이 나올 때마다 finalCount는 그 횟수만큼의 숫자로 대체된다.
4. answer값을 해당 현재까지 가장 많이 나온 수(array[i]) 로 대체하고 frequencyCount를 0으로 초기화한다.
5. 이런 식으로 for i문을 1~4번의 반복과정으로 돌린다.
이 정도면 될 것 같아서 코드 실행을 눌러봤다.
응 어림없어~
급하게 치느라 그랬는지 frequencyCount의 변수명 중 두 개를 e를 빼먹은 frequncyCount로 적었다. 심지어 선언부터 틀렸다. 긴 단어를 칠수록 오타가 발생할 확률이 높다. 이런 이유로 개발환경이 활성화되기 전에는 변수 네이밍을 짧게 하는 것이 더 좋은 작명이었다고 한다. 긴 변수명을 타이핑할 때는 더 신중하게 쳐야겠다. 변수명을 수정하고 다시 실행했다.
응 그래도 안 돼~
생각보다 쉽지 않다. 새로운 풀이법에 너무 집중했는지 배열 for문을 돌릴 때 조건식의 기초사항인 array.length까지로 범위를 설정하는 기초적인 사항도 깜빡했다. i의 범위를 99까지로 설정했으니 배열의 길이가 99가 아닌 이상 예외가 발생할 수밖에 없다.
결국 실행하는 데는 성공했으나 값이 맞지 않다ㅠㅠ 테스트 결과를 보고 나서야 풀이 중 -1을 고려하지 않았다는 사실을 알게 되었다. 이것만 문제는 아니지만 어쨌든 frequencyCount가 finalCount와 같으면 answer에 -1을 대입하도록 추가했다.
최빈값이 중복되지 않아도 틀리게 나오는 만큼, 아직 문제가 남아 있다.
원인을 찾으려고 숫자를 대입해 보다 이유를 알아냈다. i와 j의 순서가 반대로 된 것이다. i에서 index를 돌리고 j에서 숫자를 돌리면 일치하는 수를 발견해도 frequecnyCount는 한 번만 올라가고 j 반복문은 끝이다. 다른 array[i]가 같은 값을 가지고 있어도, 매번 frequencyCount를 1만 올리고, 이 상태에서 finalCount로 대체 후 0으로 초기화해서 다시 i 반복문으로 돌려보낸다. 이렇게 되면 frequencyCount의 최댓값은 1밖에 안 되는 것이다. 따라서 index 반복문과 숫자 반복문의 순서를 바꿔, 특정 i값으로 for j의 index를 돌릴 때 한 번에 모든 frequencyCount가 카운트되도록 해야 한다.
드디어 성공했다! i가 숫자, j가 index를 돌리도록 수정하고 answer에는 i를 대입하게 했다.
?
감격도 잠시, 다시 시련이 찾아왔다. 정확성이 43점밖에 되지 않는다. 아무리 봐도 맞는 것 같은데, 뭐가 문제인지 찾기가 어려웠다. 원인을 찾기 위해 테스트 케이스를 추가해 봤는데, 설상가상으로 이게 제대로 작동하지를 않는다(다음 포스팅 문제에서 테스트 케이스를 추가하다 여기서 return 값을 넣지 않았었다는 걸 알게 되었다ㅠㅠ).
return값을 설정 안 하는 바람에, 테스트 케이스에 어떤 배열 길이와 어떤 원소를 집어넣어도 기댓값은 전부 0으로 나왔다. 이것 때문에 더 헤매게 되었다.
원인을 찾아보려고 주석을 써넣다 보니 이유를 알게 되었다. else if 문을 추가하는 과정에서 frequencyCount를 0으로 초기화하는 식을 if문 밖으로 옮기지 않은 것이다. 정말 허무한 원인이다. 이전 코드에서는 frequency Count가 if문이 아닌 else if문으로 들어갔다 나오면 이미 카운트가 올라가 있는 상태로 다음 반복을 시작하게 된다. frequencyCount를 옮겼으니 이제 정상적으로 작동할 것이다(물론 추가한 테스트 케이스들은 당연히 틀렸다고 나온다).
마침내 성공했다! 점수도 10점이나 준다. 미래의 내가 보면 우스워 보일 수도 있겠지만, 지금으로선 감격의 눈물을 흘릴 수밖에 없다.
다른 풀이는 대부분 내 풀이보다도 훨씬 길다. 그만큼 최빈값은 간단하게 산출할 수 없는 결과인 것 같다. 가장 좋아요를 많이 받은 풀이는 비교적 간결한 편이다. 공부를 더 한 후에 분석해 봐야겠다.
'Coding Test' 카테고리의 다른 글
Java 코딩테스트 연습 6일차 (프로그래머스 스쿨 Lv.0, 1073점) (0) | 2023.03.12 |
---|---|
Java 코딩테스트 연습 5일차(2) (프로그래머스 스쿨 Lv.0, 1061점) (2) | 2023.03.11 |
Java 코딩테스트 책 구입, 연습 4일차 (프로그래머스 스쿨 Lv.0, 1045점) (0) | 2023.03.10 |
Java 코딩테스트 연습 3일차 (프로그래머스 스쿨 Lv.0, 1037점) (2) | 2023.03.09 |
Java 코딩테스트 연습 2일차 (프로그래머스 스쿨 Lv.0, 1019점) (0) | 2023.03.08 |