이해하기
처음 접근은 Map으로 시도했었다.
- Map에 key = 숫자, value = 개수로 잡고 전부 저장한다.
- Map 사이즈가 1이면 전부 같다는 뜻
- Map 사이즈가 2이면 다음과 같다
- 세 개가 같고 하나가 다름
- 두 개가 같고, 나머지 두 개가 같음
- Map 사이즈가 3이면 두 개가 같고, 나머지 두 개가 다름
- Map 사이즈가 4면 전부 다름
이런 식으로 구현하고 싶었는데, Map 사이즈가 2일 때 3:1인지, 2:2인지 구분하는 부분에서 아마 실패한 것 같다.
참고한 블로그⬇️
문제풀이
import java.util.*;
class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 0;
int[] dice = {a, b, c, d};
Arrays.sort(dice);
if (dice[0] == dice[3]) {
answer = 1111 * dice[3];
} else if (dice[0] == dice[2] || dice[1] == dice[3]) {
answer = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);
System.out.println(dice[1] + " " + dice[0] + " " + dice[3] + " ");
} else if (dice[0] == dice[1] && dice[2] == dice[3]) {
answer = (dice[0] + dice[2]) * Math.abs(dice[0] - dice[2]);
} else if (dice[0] == dice[1]) {
answer = dice[2] * dice[3];
} else if (dice[1] == dice[2]) {
answer = dice[0] * dice[3];
} else if (dice[2] == dice[3]) {
answer = dice[0] * dice[1];
} else {
answer = dice[0];
}
return answer;
}
}
int[] dice = {a, b, c, d};
Arrays.sort(dice);
sort를 생각해낸게 진짜 똑똑하다고 생각했다...
if (dice[0] == dice[3]) {
answer = 1111 * dice[3];
sort했는데 처음과 끝이 같다면 그 사이 값들도 전부 같은 것이니 4개가 다 같은 것으로 본다!
} else if (dice[0] == dice[2] || dice[1] == dice[3]) {
answer = (int) Math.pow(dice[1] * 10 + (dice[0] + dice[3] - dice[1]), 2);
이 부분이 좀 어려웠는데 예를 들어서 생각해보니 이해됐다.
dice = {1, 4, 4, 4}일 경우를 생각해보자. (이미 sort된 것)
이 경우 dice[0]만 다르고 , dice[1]부터 dice[3]까지 같으니 1개/3개 조합이다.
dice = {1, 1, 1, 4}일 경우도 함께 보아야 한다.
이 경우 dice[0]부터 dice[2]까지 같고, dice[3]만 다르다.
이 때, 두 경우 모두에서 3개쪽에 포함되는 인덱스를 찾아야 한다.
첫번째 경우 3개쪽에 포함되는 인덱스들은 1, 2, 3
두번째 경우 3개쪽에 포함되는 인덱스들은 0, 1, 2
1 또는 2가 겹치는 인덱스이다.
위 코드에서는 1을 겹치는 인덱스로 사용하였다.
그래서 다시 식을 살펴보면 세 개 나온 숫자가 p, 하나 나온 숫자가 q일 때, answer = (10 * p + q)^2이다.
p를 dice[1]로 잡고, q를 찾아야하는데 이 q가 또 문제다.
첫번째 경우에는 dice[0]이 q이고, 두번째 경우에는 dice[3]이 q이다.
위 식에서는 q를 dice[0] + dice[3] - dice[1]로 잡았는데 이 또한 예시들을 가지고 생각해보자.
dice = {1, 4, 4, 4}일 경우 q = 1 + 4 - 4 = 1이 된다.
dice = {1, 1, 1, 4}일 경우 q = 1 + 4 - 1 = 4가 된다.
p값 또는 q값이 될 수 있는 경우인 dice[0]과 dice[3]을 더해놓고, (p + q)
3개쪽 수인 p값을 빼주면 q만 남게 되는 것이다. (p + q - p) = q
} else if (dice[0] == dice[1] && dice[2] == dice[3]) {
answer = (dice[0] + dice[2]) * Math.abs(dice[0] - dice[2]);
이건 두 개, 두 개씩 같은 경우
} else if (dice[0] == dice[1]) {
answer = dice[2] * dice[3];
} else if (dice[1] == dice[2]) {
answer = dice[0] * dice[3];
} else if (dice[2] == dice[3]) {
answer = dice[0] * dice[1];
두 개만 같고, 나머지는 각각 다를 경우
} else {
answer = dice[0];
}
전부 다를 경우
'JAVA > Coding Test Study' 카테고리의 다른 글
[Lv.0] 프로그래머스 - 접미사인지 확인하기 (1) | 2024.04.19 |
---|---|
[Lv.0] 프로그래머스 - 배열 만들기 5 : Java (0) | 2024.04.19 |
[Lv.1] 프로그래머스 - 최대공약수와 최소공배수 : Java (1) | 2024.04.19 |
[Lv.0] 프로그래머스 - 두 수의 합 : Java (0) | 2024.04.16 |
[Lv.0] 프로그래머스 - 코드 처리하기 : Java (0) | 2024.04.16 |