알고리즘 코테준비

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

Grapefruitgreentealoe 2025. 2. 12. 11:53
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/181916

function solution(a, b, c, d) {
    var answer = 0;
        
    //1. 일단 작은 순으로 정렬한다.(오름차순)
    const [q,w,e,r] = [a,b,c,d].sort((x,y)=>x-y)
    //2. 값이 모두 같을 때
    if(q==r){
        answer = q * 1111;
    }else if(q==e){//3개가 같을때
            answer = (10*q+r) * (10*q+r)
    }else if(w==r){//3개가 같을때
            answer = (10*r + q) * (10*r + q)
    }
    else if(q==w && e==r){//2개 2개 같을 때
        answer = (q+e)*(e-q)
    }
    else if(q==w){//2개가 같고 나머진 다를 때
        answer = e*r
    }
    else if(e==r){//2개가 같고 나머진 다를 때
        answer = q*w
    }
    else if(w==e){
        answer = q*r
    }
    else{//다 다를떄
        answer = q
    }
    
    return answer;

}

반례가 중요했는데, 오름차순으로 정렬 하고, 

작은수부터 비교하고, 큰수부터 비교하는 조건으로 하다가

가운데의 값이 같은 경우를 놓쳤었다. 

 

 

다른 사람의 답 분석

더보기
function count(arr) {
  const counter = new Map();
  for (const num of arr) {
    counter.set(num, (counter.get(num) || 0) + 1);
  }
  const sortedByCnt = [...counter.keys()].sort((a, b) => counter.get(b) - counter.get(a));
  const maxCnt = Math.max(...counter.values());
  return [sortedByCnt, maxCnt];
}

function solution(a, b, c, d) {
  const [arr, maxCnt] = count([a, b, c, d]);
  const [p, q, r, s] = arr;
  if (arr.length === 1) {
    return p * 1111;
  }
  if (arr.length === 2) {
    return maxCnt === 2 ? (p + q) * Math.abs(p - q) : (10 * p + q) ** 2;
  }
  if (arr.length === 3) {
    return q * r;
  }
  return Math.min(p, q, r, s);
}

 

count라는 함수를 정의했다.

일단 Map 을 쓴게 인상깊었다. 나는 잘 쓸 줄 모르는데 여기서 잘 배워가야겠다.

counter라는 변수에 Map 객체를 할당

카운터에 num을 키값으로 쓰고,

숫자가 없다면 즉 중복되지 않는다면 1이되고, 중복이 되면 counter +1을 넣어준다. 

숫자별로 몇개가 존재하는 지를 확인하는 것 같다. 

 

그 다음, 카운터의 키값만 배열로 만들어서 내림차순으로 정렬한 배열을 sortedByCnt에 할당

그리고 카운터의 값, 즉 반복된 횟수의 최대값을 maxCnt라는 곳에 할당한다. 

그리고 키값 내림차순배열과 반복횟수최대값을 리턴해준다. 

 

solution함수

abcd의 값을 통해서 우선 내림차순배열과 반복횟수최대값을 받는다. 

p,q,r,s 각각에 순서대로 숫자를 할당한다. 

여기서 처음 본 문법으로,

[p,q,r,s]=arr라고 했을때, 꼭 arr의 길이가 4가 아니어도 된다는 것을 처음 봤다. 

 

그리고 arr의 길이에 따라서 중복된 숫자의 횟수를 확인한다. 

1이면 모두 같은것이고,

arr 길이가 2인 경우 maxCnt가 2인경우. 즉 반복되는 수가 2개이면서 최대 반복횟수가 2인 경우와
아닌경우. 즉 반복되는 수는 2개인데 maxCnt가 3인 경우

 

arr의 길이가 3인경우, 즉 2개가 중복되고 나머지 2개는 다른 수인경우

 

그리고 가장작은 수

 

 

다른사람 글 분석2

더보기
function solution(a, b, c, d) {
  const map = new Map();
  for (const data of [a, b, c, d]) {
    map.set(data, (map.get(data) || 0) + 1);
  }

  const sortedArr = [...map].sort((a, b) => {if (a[1] === b[1]) return b[0] - a[0]; else return b[1] - a[1]});

  if (map.size === 1) return 1111 * sortedArr[0][0];
  else if (map.size === 3) return sortedArr[1][0] * sortedArr[2][0];
  else if (map.size === 4) return sortedArr[3][0];
  else if (sortedArr[0][1] === 3) return (10 * sortedArr[0][0] + sortedArr[1][0]) ** 2;
  else return (sortedArr[0][0] + sortedArr[1][0]) * (sortedArr[0][0] - sortedArr[1][0]);
}

이것도 비슷한 거 같다.

set으로 만들어서, 반복횟수 값으로 넣어주고

그런데 map객체를 sort했다. 이게 가능한지는 몰랐다. 

 

map.size가 1 즉 모두 같은 경우

3 즉 2개만 같은 경우

4 즉 모두 다른 경우

3개의 숫자가 같은 경우

나머지 2쌍인경우

 

이 문제의 핵심은 중복 제거를 통해서 조건을 줄일 수 있다는 것 같다. 

 

궁금해진 점.

map과  set의 차이
https://velog.io/@parkcode/JavaScript-set%EA%B3%BC-map

 

그리고 object와의 차이

https://cocococo.tistory.com/entry/JavaScript-MapMap-Object-%EB%A9%94%EC%84%9C%EB%93%9C-%EB%B0%8F-%EB%B0%98%EB%B3%B5%EB%AC%B8-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

반응형