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

2024. 12. 10. 12:22·Coding Test

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

 

 

얼마전 접했던 '야추 다이스' 라는 보드게임의 룰이 생각났다.

우선 조건문 4개가 나오면 될 것 같고.,

2,3,4번 조건은 그 안에서 조건문을 파생시켜 구현해야 할 것 같다.

 

 

초기 코드

function solution(a, b, c, d) {
    let arr = [a,b,c,d]
    let set = [...new Set(arr)]
    if(set.length==1) {
        return 1111*a
    } else if(set.length==2) {
        return '두개 같'
    } else if(set.length==3) {
        return '세개 같'
    } else if(set.length==4) {
        return Math.min(...arr)
    } 

}

 

뭔가 set 자료형을 이용해서 중복된 요소를 구한다는 건 알겠는데... 여기서 막혔다.

 

한 시간 가량 고민해본 결과

set과 arr의 뺄셈을 이용하면 코드가 지저분해지긴 하지만

어쨋든 기능구현은 할 수 있을 것 같았다.

 

최종 코드

function solution(a, b, c, d) {
    let arr = [a,b,c,d]
    let set = [...new Set(arr)]
    if(set.length==1) {
        return 1111*a
    } else if(set.length==2) {
        if(arr.reduce((acc, init)=>acc+=init,0) / set.reduce((acc, init)=>acc+=init,0)==2) {
            return Math.abs(set[0]**2-set[1]**2)
        } else {
            let l = (arr.reduce((acc, init)=>acc+=init,0) - set.reduce((acc, init)=>acc+=init,0))/2;
            let res = arr.filter((a)=>a !== l);
            return (10*l+res[0])**2
        }
    } else if(set.length==3) {
        let l = arr.reduce((acc, init)=>acc+=init,0) - set.reduce((acc, init)=>acc+=init,0);
        let res = arr.filter((a)=>a !== l);
        return res[0]*res[1]
    } else if(set.length==4) {
        return Math.min(...arr)
    } 

}

 

알고리즘 적으로 썩 좋지 못한 코드...같지만

꽤 낮은 정답률의 문제를 풀었다는 것에 의의를 두고

다른 사람의 풀이를 보며 배울 점을 찾아보자

 

 

다른 사람의 풀이

function solution(a, b, c, d) {
    if (a === b && a === c && a === d) return 1111 * a

    if (a === b && a === c) return (10 * a + d) ** 2
    if (a === b && a === d) return (10 * a + c) ** 2
    if (a === c && a === d) return (10 * a + b) ** 2
    if (b === c && b === d) return (10 * b + a) ** 2

    if (a === b && c === d) return (a + c) * Math.abs(a - c)
    if (a === c && b === d) return (a + b) * Math.abs(a - b)
    if (a === d && b === c) return (a + b) * Math.abs(a - b)

    if (a === b) return c * d
    if (a === c) return b * d
    if (a === d) return b * c
    if (b === c) return a * d
    if (b === d) return a * c
    if (c === d) return a * b

    return Math.min(a, b, c, d)
}

 

정말 순 노가다지만

성능 면에서든 가독성에서든 위 코드가 제일 나았다.

 

때로는 노가다로 나열해서 푼 코드가

함수 덕지덕지 붙인 코드보다 낫다는 것 깨닫게 해준 문제.

 

 

'Coding Test' 카테고리의 다른 글

[JS] 프로그래머스 / 덧칠하기  (0) 2024.12.21
[JS] 프로그래머스 / <PCCP 기출문제> / 1번 - 동영상 재생기  (1) 2024.12.16
[JS] 프로그래머스 / 푸드 파이트 대회  (1) 2024.12.14
[JS] 프로그래머스 / 크기가 작은 부분 문자열  (0) 2024.12.13
[JS] 프로그래머스 / 배열 만들기 2  (0) 2024.12.09
'Coding Test' 카테고리의 다른 글
  • [JS] 프로그래머스 / <PCCP 기출문제> / 1번 - 동영상 재생기
  • [JS] 프로그래머스 / 푸드 파이트 대회
  • [JS] 프로그래머스 / 크기가 작은 부분 문자열
  • [JS] 프로그래머스 / 배열 만들기 2
freesqqq
freesqqq
Fear only God, Hate only sins
  • freesqqq
    999
    freesqqq
    • Life Log (39)
      • Coding Test (12)
      • JavaScript (6)
      • TypeScript (2)
      • React (4)
      • Vue (0)
      • Next.js (1)
      • Html & css (0)
      • Git & Github (0)
      • Noising Log (1)
      • Reading Log (8)
      • Projects 🚀 (5)
        • Goodiary (AI 일기 사이트) (0)
        • Readiping (독서 커뮤니티) (1)
        • Couchilla (음반 거래 플랫폼) (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    Lv.1
    자바스크립트상속
    프머스
    supabase
    프로그래머스
    자기계발
    js
    자바스크립트
    죽음에이르는병
    reduxtoolkit
    크기가 작은 부분 문자열
    코테
    javascript
    유신론적실존주의
    힘든일을먼저하라
    대충만든자판
    그릿
    수파베이스
    미루는습관
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
freesqqq
[JS] 프로그래머스 / 주사위 게임 3
상단으로

티스토리툴바