https://school.programmers.co.kr/learn/courses/30/lessons/120812
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 답안1(오답)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
class Solution {
public int solution(int[] array) {
int answer = 0;
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for(int data:array) {//array에 입력된 값들을 중복없이 arrayList에 넣는다.
if(!arrayList.contains(data)) {
arrayList.add(data);
}
}
int[]count=new int[arrayList.size()];//array에 있는 값들의 중복객수를 구하기 위한 count배열이다.
for (int i = 0; i < arrayList.size(); i++) {
//arrayList에 있는 값들을 이용해 array에 있는 값과 하나하나 씩 비교한다.
for (int j = 0; j < array.length; j++) {
if (arrayList.get(i)==array[j]) {
count[i]=count[i]+1;//중복되는 수 마다 한개씩 카운트해준다.
}
}
}
int max=0;
Integer[] as = new Integer[count.length];
for (int i = 0; i < count.length; i++) {
max=Math.max(max, count[i]);
as[i]=count[i];
}//count 배열에서 가장 큰값이 무엇인지 알아내고 Collections 사용을 위해 as배열에 count배열 값을 넣는다.
int index=Arrays.binarySearch(count, max);//count에서 가장 큰값의 인덱스를 구한다.
int index_count=Collections.frequency(Arrays.asList(as), max);//최빈값 개수가 겹쳐지는지 확인한다.
if (index_count>=2) {//최빈값이 2개일 경우 -1을 리턴한다.
answer= -1;
}else {//최빈값이 하나일경우 count에 있는 인덱스 값을 arrayList에 넣어 최빈값을 출력한다.
//count의 인덱스를 arrayList 인덱스는 같기 때문에 count의 인덱스 값을 arrayList에 입력해서 나온수가 최빈값이다.
answer= arrayList.get(index);
}
return answer;
}
}
- 값은 정확하게 다 나왔지만 테스트 케이스에서 런타임에러 여러개가 나왔다.
- 이유는 'int index=Arrays.binarySearch(count, max);'가 문제였다. binarySearch메소드는 정렬된 배열에서 동작하는 알고리즘이다. 정렬되지 않은 배열때문에 일어난 오류였다.
for(int i = 0; i<count.length;i++){
if(max<count[i]){
max=count[i];
index=i;
}
}
- 그래서 해당 부분을 for문방식으로 고쳐야 했다.
2. 답안2(정답)
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
class Solution {
public int solution(int[] array) {
int answer = 0;
Map<Integer, Integer>map=new HashMap<Integer, Integer>();
for (int i : array) {
map.put(i,map.getOrDefault(i, 0)+1);
}//HashMap을 통해 키와 값 형식으로 값을 입력받았다.
//키에는 array배열에 있는 중복없는 숫자들,
//value에는 getOrDefault를 통해 해당 숫자의 개수가 들어간다.
Integer max = Collections.max(map.values());
//max는 map의 value중 최대값을 찾는다.
int cnt=0;
int key=0;
for (Entry<Integer, Integer> i : map.entrySet()) {
if(i.getValue()==max) {
cnt++;
key=i.getKey();
}
}//최대 value값을 가진 map의 key값을 찾아낸다.
//그리고 최대 value값이 몇개가 있는지 cnt를 통해 파악한다.
if(cnt>1) {//최대 value값이 여러개라면 -1을 리턴하고 아니면 해당 key의값을 리턴한다.
answer=-1;
}else {
answer=key;
}
return answer;
}
}
- map을 통해 key, value를 통해서 푼 결과 코드가 더 간단해졌고 쉽게 구할 수 있었다.
'프로그래머스 > JAVA' 카테고리의 다른 글
[프로그래머스][자바] 배열 자르기 (0) | 2023.07.08 |
---|---|
[프로그래머스][자바] 짝수의 합 (0) | 2023.07.08 |
[프로그래머스][자바] 양꼬치 (0) | 2023.07.08 |
[프로그래머스][자바] 각도기 (0) | 2023.07.08 |
[프로그래머스][자바] 특정 문자 제거하기 (0) | 2023.07.08 |