새소식

Study/Algorithm

[프로그래머스] 주사위 게임 3 - JavaScript

  • -

문제 설명

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)
    }
  }
}

 

Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.