문제 설명
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 함수를 작성해 주세요.
제한사항
- a, b, c, d는 1 이상 6 이하의 정수입니다.
입출력 예
a |
b |
c |
d |
result |
2 |
2 |
2 |
2 |
2222 |
4 |
1 |
4 |
4 |
1681 |
6 |
3 |
3 |
6 |
27 |
2 |
5 |
2 |
6 |
30 |
6 |
4 |
2 |
5 |
2 |
문제 풀이
이 문제를 보고 처음에 딱 든 생각은 map을 사용해서 풀면 편하겠다 였다.
중복이면 카운트 해주고 4면 무조건 1111 을 곱해주고
근데 3부터 문제였던게 처음에는 그냥 map.get()해서 나오는 value로 if문을 작성했는데 그랬더니 다음 값을 get할 수가 없었다ㅋㅋ..
그래서 for of 로 key와 value 값을 받는 형식으로 바꿨다.
편하게 value가 4인지 3인지 2인지 1인지 확인 해준 다음
3이면 무조건 map의 size가 2개니까 현재 key를 p, 이 인덱스의 다음 값을(혼자서 다른 값) q로 넣어주면 됐다.
이렇게 푼 코드는 채점에서 몇 문제 틀려서 생각해보니 sort를 안해줘서
4 1 4 4 이 경우엔 1681 인데 1 4 4 4 는 1963?이라는 결과가 나오게 된다.
그래서 다시 map을 미리 sort 해주고 반복문을 돈 다음에
length가 2일 경우에는 q를 현재 값의 다음 인덱스 즉, result[1][0] 로 해주고 // result는 현재 [키, 값] 방식
주사위가 2개는 겹치고 나머지 2개가 다 다른 값인 경우 result[1][0], result[2][0] 를 각각 q, r에 넣어주고
value가 1인데 length가 4인 경우는 모두 다 다르게 나온 경우이므로 최소값을 리턴해준다.
참고로 수포자인 나는
- 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
이 문항에서 |p-q| 이 작대기의 뜻을 몰랐는데,,, 절대값이다,,, 힝구르 수포자는 웁니다.
전직 수학쌤인 엄마의 도움으로 절대값이라는 걸 듣고
Math.abs()를 사용해서 절대값을 넣어줬다.
최종 코드
function solution(a, b, c, d) {
let result = [a, b, c, d].reduce((accu,curr)=> {
accu.set(curr, (accu.get(curr)||0) +1) ;
return accu;
}, new Map());
result = [...result].sort((a, b) => b[1] - a[1])
for (let [key, val] of result) {
if(val === 4) {
return 1111*key
}
if(val === 3) {
let q = result[1][0]
return (10*key + q)*(10*key + q)
}
if(val === 2 && result.length === 2) {
let q = result[1][0]
return (key + q)*Math.abs(key - q)
}
if(val === 2 && result.length === 3) {
let q = result[1][0]
let r = result[2][0]
return q*r
}
if(val === 1 && result.length === 4) {
return Math.min(a,b,c,d)
}
}
}