[문제]
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.
네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
[Algorithm]
처음 생각한 방법은 stream을 사용해서 중복 제거 후, 남은 배열의 길이로 나눠서 결과 return 하는 것
🚨 문제점 : aaab / aabb 의 구분이 안 됨
➡️ 배열을 이용해서 같은 값이 몇 개인지 count하고 그에 알맞는 분기 처리로 결과 return
[Code]
import java.util.*;
class Solution {
public int solution(int a, int b, int c, int d) {
int[] count = new int[7];
count[a]++;
count[b]++;
count[c]++;
count[d]++;
List<Integer> unique = new ArrayList<>();
int p = 0, q = 0, r = 0;
for (int i = 1; i <= 6; i++) {
if (count[i] == 4) return 1111 * i;
if (count[i] == 3) p = i;
if (count[i] == 2) {
if (p == 0) p = i;
else q = i;
}
if (count[i] == 1) {
if (q == 0) q = i;
else r = i;
}
}
if (p != 0 && count[p] == 3) {
return (int) Math.pow(10 * p + q, 2);
} else if (q != 0 && count[p] == 2 && count[q] == 2) {
return (p + q) * Math.abs(p - q);
} else if (count[p] == 2) {
return q * r;
} else {
return Math.min(a, Math.min(b, Math.min(c, d)));
}
}
}
넘 복잡한 문제였음 ;;
'Algorithm Study' 카테고리의 다른 글
[Java Algorithm] 프로그래머스 Lv.0 _ 간단한 논리 연산 (1) | 2025.03.05 |
---|---|
[Java Algorithm] 프로그래머스 Lv.0 _ 배열 만들기 4 (0) | 2025.02.25 |
[Java Algorithm] 프로그래머스 Lv.0 _ 콜라츠 수열 만들기 (0) | 2025.02.25 |
[Java Algorithm] 프로그래머스 Lv.0 _ 수열과 구간 쿼리 2 (0) | 2025.02.24 |
[Java Algorithm] 프로그래머스 Lv.0 _ 수열과 구간 쿼리 3 (1) | 2025.02.24 |