
내가 생각했을때 문제에서 원하는부분
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 함수를 작성해 주세요.
내가 이 문제를 보고 생각해본 부분
Main29 클래스는 programmers 패키지에 포함된다.
main 메서드 내에서 Solution 클래스를 생성하고, 주어진 테스트 데이터를 solution 메서드에 넣어 결과를 출력한다.
Solution 클래스는 static class로 Main29 내부에 포함되어 있다.
이렇게 하면 별도의 파일 분리 없이 한 곳에서 관리할 수 있다.
solution 메서드는 네 주사위 숫자를 입력받아, 각 숫자 별 등장 횟수를 HashMap에 저장한다.
등장한 숫자의 종류 개수(counts.size())를 기준으로 점수 계산 규칙을 적용한다.
1개: 네 주사위가 모두 같아서 1111 × 숫자 점수이다.
2개: 세 개가 같고 한 개가 다르거나, 두 개씩 두 쌍으로 나오는 경우를 구분해 각각 점수를 계산한다.
3개: 한 쌍만 같고 나머지 두 숫자가 다르므로 나머지 두 숫자의 곱을 점수로 한다.
4개: 모두 다르기에 가장 작은 숫자로 점수를 정한다.
위 규칙은 문제 설명과 완벽히 일치한다.
메인 메서드에서 여러 예제를 출력해 정상 동작을 바로 확인할 수 있도록 했다.
코드로 구현
import java.util.HashMap;
import java.util.Map;
class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 0;
int[] dice = {a, b, c, d};
Map<Integer, Integer> counts = new HashMap<>();
for (int num : dice) {
counts.put(num, counts.getOrDefault(num, 0) + 1);
}
if (counts.size() == 1) {
int p = dice[0];
answer = 1111 * p;
} else if (counts.size() == 2) {
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
if (entry.getValue() == 3) {
int p = entry.getKey();
int q = 0;
for (int key : counts.keySet()) {
if (key != p) q = key;
}
answer = (10 * p + q) * (10 * p + q);
return answer;
}
}
int[] keys = counts.keySet().stream().mapToInt(Integer::intValue).toArray();
int p = keys[0];
int q = keys[1];
answer = (p + q) * Math.abs(p - q);
} else if (counts.size() == 3) {
int p = 0, q = 0, r = 0;
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
int key = entry.getKey();
int val = entry.getValue();
if (val == 2) {
p = key;
} else {
if (q == 0) q = key;
else r = key;
}
}
answer = q * r;
} else {
int min = Integer.MAX_VALUE;
for (int num : dice) {
if (num < min) min = num;
}
answer = min;
}
return answer;
}
}
프로그래머스 코드
package programmers;
import java.util.HashMap;
import java.util.Map;
// 프로그래머스 주사위 게임 3
public class Main29 {
public static void main(String[] args) {
Solution sol = new Solution();
// 테스트용 출력
System.out.println(sol.solution(2, 2, 2, 2)); // 2222
System.out.println(sol.solution(4, 1, 4, 4)); // 1681
System.out.println(sol.solution(6, 3, 3, 6)); // 27
System.out.println(sol.solution(2, 5, 2, 6)); // 30
System.out.println(sol.solution(6, 4, 2, 5)); // 2
}
static class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 0;
int[] dice = {a, b, c, d};
Map<Integer, Integer> counts = new HashMap<>();
for (int num : dice) {
counts.put(num, counts.getOrDefault(num, 0) + 1);
}
if (counts.size() == 1) {
int p = dice[0];
answer = 1111 * p;
} else if (counts.size() == 2) {
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
if (entry.getValue() == 3) {
int p = entry.getKey();
int q = 0;
for (int key : counts.keySet()) {
if (key != p) q = key;
}
answer = (10 * p + q) * (10 * p + q);
return answer;
}
}
int[] keys = counts.keySet().stream().mapToInt(Integer::intValue).toArray();
int p = keys[0];
int q = keys[1];
answer = (p + q) * Math.abs(p - q);
} else if (counts.size() == 3) {
int p = 0, q = 0, r = 0;
for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
int key = entry.getKey();
int val = entry.getValue();
if (val == 2) {
p = key;
} else {
if (q == 0) q = key;
else r = key;
}
}
answer = q * r;
} else {
int min = Integer.MAX_VALUE;
for (int num : dice) {
if (num < min) min = num;
}
answer = min;
}
return answer;
}
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.