🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔺 코드
import java.util.*;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[2]; // 최고 순위, 최저 순위
int cnt = 0;
for(int i=0 ; i < lottos.length ; i++) {
for(int j=0 ; j < win_nums.length ; j++) {
if(lottos[i] == win_nums[j]) {
cnt++;
}
}
}
int zeroCnt = 0;
for(int i: lottos) {
if(i == 0) {
zeroCnt++;
}
}
int max = cnt + zeroCnt;
int min = cnt;
switch(max) {
case 2 : answer[0] = 5;
break;
case 3 : answer[0] = 4;
break;
case 4 : answer[0] = 3;
break;
case 5 : answer[0] = 2;
break;
case 6 : answer[0] = 1;
break;
default: answer[0] = 6;
break;
}
switch(min) {
case 2 : answer[1] = 5;
break;
case 3 : answer[1] = 4;
break;
case 4 : answer[1] = 3;
break;
case 5 : answer[1] = 2;
break;
case 6 : answer[1] = 1;
break;
default: answer[1] = 6;
break;
}
return answer;
}
}
✅ 해결 아이디어
- 반복문 돌려서 당첨번호랑 몇 개 맞는지 카운트 (cnt)
- 0 갯수 카운트 (zeroCnt)
└ 최대 당첨인 경우 : cnt + zeroCnt (맞은 갯수 + 0 갯수)
└ 최소 당첨인 경우 : cnt (맞은 갯수만)
- switch문으로 조건에 맞게 값 삽입..
2중 for문에다가 내용이 거의 같은 switch-case문이 2개나 들어가고 이래서 좋은 코드는 아닌 듯하다...🤔
🔺 다른 풀이들
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 풀이1) Map사용
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
int zeroCount = 0;
for(int lotto : lottos) {
if(lotto == 0) {
zeroCount++;
continue;
}
map.put(lotto, true);
}
int sameCount = 0;
for(int winNum : win_nums) {
if(map.containsKey(winNum)) sameCount++;
}
int maxRank = 7 - (sameCount + zeroCount);
int minRank = 7 - sameCount;
if(maxRank > 6) maxRank = 6;
if(minRank > 6) minRank = 6;
return new int[] {maxRank, minRank};
}
}
Map을 사용하셨다...!
그리고 최고 순위 최저 순위 구하는 방법이 굿!!! (23-26번째 줄)
나는 무작정 if문이나 switch/case문 쓸 생각부터 했는디.. 반성....!
- 풀이2) switch/case문 메소드화
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[2];
int cnt1 = 0;
int cnt2 = 0;
for(int i : lottos) {
if(i == 0) {
cnt1++;
continue;
}
for(int j : win_nums) {
if(i == j) cnt2++;
}
}
answer[0] = getGrade(cnt1+cnt2);
answer[1] = getGrade(cnt2);
return answer;
}
public int getGrade(int n) {
switch(n) {
case 6 :
return 1;
case 5 :
return 2;
case 4 :
return 3;
case 3 :
return 4;
case 2 :
return 5;
default :
return 6;
}
}
}
같은 switch/case문을 써도 반복되는 걸 메소드화해서 사용하신 거 굿....
- 풀이3) Arrays.binarySearch()
, 이진탐색 사용
import java.util.*;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] rank = {6, 6, 5, 4, 3, 2, 1};
int answer = 0;
int hidden = 0;
Arrays.sort(win_nums);
for (int i = 0; i < lottos.length; i++)
if (Arrays.binarySearch(win_nums, lottos[i]) > -1)
answer++;
else if (lottos[i] == 0)
hidden++;
return new int[] {rank[answer + hidden], rank[answer]};
}
}
자바 이진탐색..
직접 구현할 생각만 했었는데
정렬 먼저 해놓고 나서 Arrays.binarySearch()
로 값 구해도 되는구나...
(참고)
✔ switch/case문
04-02 switch/case 문
switch/case 문은 if 문과 비슷하지만 좀 더 정형화된 조건 판단문이다. switch/case 문의 구조는 다음과 같다. ```{.java} switch(입력변수) …
wikidocs.net
✔ 자바 이진탐색 - Arrays.binarySearch()
JAVA에서의 이진탐색 (Arrays.binarySearch())
백준 1920번을 풀면서 JAVA의 이진탐색에 대해 다시 알게 되었다. 해당 문제는 입력값이 저장된 ...
blog.naver.com
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Lv. 2] 최댓값과 최솟값 (0) | 2023.03.30 |
---|---|
[프로그래머스/Lv. 1] 실패율 (0) | 2023.03.29 |
[프로그래머스/Lv. 1] [1차] 비밀지도 (0) | 2023.03.24 |
[프로그래머스/Lv. 1] [1차] 다트 게임 (0) | 2023.03.20 |
[프로그래머스/Lv. 1] 체육복 (1) | 2023.03.16 |