100세까지 코딩
[프로그래머스] Lv0.최빈값 구하기 본문
문제 설명
풀기 전 생각
- array의 원소를 새로운 배열(횟수 배열)의 index로 생각하여 나올 때마다 횟수 배열값에 +1해 주기
- 최빈값은 횟수 배열의 인덱스 대입, 최대로 나온 횟수는 cntMax라는 변수에 횟수 배열 값 대입
- 후에 나온 횟수 배열 값이 이전 cntMax와 값이 같으면 temp라는 곳에 최빈값 출현 횟수 대입
- temp와 cntMax가 같으면 최빈값이 2개이므로 답은 -1, 그렇지 않으면 답은 횟수 배열 인덱스
class Solution {
public int solution(int[] array) {
int answer = 0;
int[] cntArr = new int[1000]; // 나오는 횟수가 저장될 배열
int max = 0; // 최빈값을 저장할 변수
int cntMax = 0; // 최빈값 나온 횟수를 저장할 변수
int temp = 0; // 최빈값 나온 횟수 같은때, 최빈값을 횟수를 저장할 변수
for(int i = 0; i < array.length; i++){
cntArr[array[i]]++; // array 배열안에 숫자를 cntArr의 인덱스로 생각해서 값+1 해준다.
}
for(int i = 0; i < cntArr.length; i++){
if(cntArr[i]>cntMax){ // 횟수 배열안에 값이 cntMax보다 크면
max = i; // 최빈값은 횟수 배열의 INDEX
cntMax = cntArr[i]; // cntMax는 횟수 배열의 값
}else if(cntArr[i]==cntMax){ // 횟수 배열의 값과 이전 최빈값 출현 횟수가 같으면
temp = cntMax; // temp에 최빈값 출현 횟수 저장
}
}
if(cntMax == temp){ // 현재 최빈값 출현 횟수와 이전 temp에 저장된 출현 횟수가 같으면
answer = -1; // 최빈값이 여러개이므로 -1
}else{
answer = max; // 아니면 최빈값이 답
}
return answer;
}
}
오류 및 개선
- 오류는 없었지만 개선 사항 필요
- 2번째 반복문에서 if - else if기 때문에 temp가 굳이 필요 없이 cntArr [i]==cntMax이면 answer = -1로 하면 된다
- 또한, max 변수도 필요 없이 바로 answer = i로 하면 가독성이 증가
최종
class Solution {
public int solution(int[] array) {
int answer = 0;
int[] cntArr = new int[1000]; // 나오는 횟수가 저장될 배열
int cntMax = 0; // 최빈값 나온 횟수를 저장할 변수
for(int i = 0; i < array.length; i++){
cntArr[array[i]]++; // array 배열안에 숫자를 cntArr의 인덱스로 생각해서 값+1 해준다.
}
for(int i = 0; i < cntArr.length; i++){
if(cntArr[i]>cntMax){ // 횟수 배열안에 값이 cntMax보다 크면
answer = i; // i가 최빈값
cntMax = cntArr[i]; // cntMax는 i일때 횟수 배열의 값
}else if(cntArr[i]==cntMax){ // 횟수 배열의 값과 이전 최빈값 출현 횟수가 같으면
answer = -1; // 최빈값이 2개 이상이므로 -1
}
}
return answer;
}
}
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.OX퀴즈 (0) | 2023.08.18 |
---|---|
[프로그래머스] Lv0.유한소수 판별하기 (0) | 2023.08.18 |
[프로그래머스] Lv0.문자열 밀기 (0) | 2023.08.16 |
[프로그래머스] Lv0.다항식 더하기 (0) | 2023.08.14 |
[프로그래머스] Lv0.안전지대 (0) | 2023.08.13 |