js/[문제풀이] programmers

[js] 먹방 bj 우승자 찾기_FoodBj

우금붕 2023. 1. 10. 10:41

[문제 설명]

유명한 먹방 BJ 5명이 짜장면을 제한 시간 내에 다 먹을 시에 짜장면 무료 혜택과 상금 150만 원을 받게 되는 중국집을 방문했습니다.
첫 번째 짜장면을 다 먹은 BJ는 다음 짜장면도 먹을 수 있고 혜택과 상금도 동일하게 제공됩니다.
짜장면 세 그릇을 먹은 1명의 BJ만이 우승을 거머쥐었습니다.
짜장면을 한 그릇도 먹지 못한 BJ는 없습니다.
참가자 5명의 이름을 BJ 배열에 담고 한 그릇씩 먹은 참가자들의 이름을 one 배열에, 두 그릇씩 먹은 참가자들의 이름을 two 배열에 담아 짜장면의 상금으로 지출된 금액과 우승자의 이름을 출력하는 함수, solution을 완성해주세요. 출력 형식은 아래 [출력 형식]을 참고하세요.


[제한 사항]

- BJ들의 이름은 같을 수 없습니다.
- 참가한 BJ는 총 5명입니다.
- 준비된 짜장면은 최대 20그릇입니다.


[입력 형식]

- BJ와 짜장면을 한 그릇 먹은 배열(one)과 짜장면을 두 그릇 먹은 배열(two)가 주어집니다.


[출력 형식]

- BJ들의 상금을 숫자로 표현하고 우승자를 괄호 내에 표시하여 문자열로 반환합니다. (예: "1350만원(하밥)")

 

 

[문제풀이]

function solution(bj, one, two) {
    let reward = (one.length + 2 * two.length + 3)*150;
    let ot = [...new Set([...one, ...two])];
    let winner = bj.filter(x => !ot.includes(x)).join();

    return reward+'만원('+winner+')';
}

 

[해설]

함수 solution은 bj(5명의 bj 이름), one(한 그릇 먹은 bj 이름), two(두 그릇 먹은 bj 이름) 세가지 입력을 받는다.

모든 bj는 최소 한 그릇을 먹고, 세 그릇을 먹은 bj가 우승하기 때문에

(한 그릇을 먹은 bj의 수 * 150) + (두 그릇을 먹은 bj의 수 * 150 * 2) + (150 * 3)

이 최종 상금이 된다.

 

reward는 상금을 계산한다.

ot는 set 함수를 이용하여 one 배열과 two 배열을 합칩니다.

winner는 filter 함수와 includes 함수를 사용하여 bj와 ot 배열을 비교하여 겹치지 않는 하나의 요소를 추출하고 join 함수로 배열을 문자열로 바꿔줍니다.

 

따라서 상금과 winner 이름을 반환하게 됩니다.

 

 

* set 함수

집합. 중복을 허용하지 않습니다.

let ot = [...new Set([...one, ...two])];

여기서는 Spread Operator(전개연산자) '...'로 Set 객체의 값들을 하나씩 전개, 즉 꺼내서 새로운 배열의 원소로 넣고, ot에 저장하는 것을 의미합니다.

 

 

*includes 함수

배열이 특정 요소를 포함하고 있는지 판별합니다.

ot.includes(히밥)

위 코드는 ot 배열이 '히밥'이라는 문자열을 포함하는지 판별합니다.

 

 

*filter 함수

주어진 함수의 test를 통과하는 모든 요소를 모아 새로운 배열로 반환합니다.

let winner = bj.filter(x => !ot.includes(x));

여기서는 bj 함수를 대상으로 ot 함수에 있는 값이 bj에 없는 요소(차집합)를 추출하는 것입니다.

만약 !ot.incldues(x)가 아닌 ot.includes(x)였다면 bj 배열과 ot 배열에 둘 다 존재하는 요소(교집합)를 모두 추출합니다.

 

따라서 filter 함수와 includes 함수를 함께 사용하면 배열의 교집합, 차집합을 구할 수 있습니다.

 

*join 함수

배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.

괄호 안에는 seperator(구분자)를 지정합니다. 생략하면 배열의 요소들이 쉼표로 구분됩니다.

const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// expected output: "Fire,Air,Water"

console.log(elements.join(''));
// expected output: "FireAirWater"

console.log(elements.join('-'));
// expected output: "Fire-Air-Water"

 

 

 

[다른 사람 풀이]

function solution(bj, one, two) {

    // one, two에 배열안에 없는애를 리턴 
    let one1 = bj.filter(x => !one.includes(x))
    let two2 = one1.filter(x => !two.includes(x));

    let sum = two2.length * 450 + one.length * 150 + two.length * 300;
    return `${sum}만원(${two2})`
}

 

[느낀점]

저는 one two를 합치고 이를 bj와 비교하는 방법을 사용했는데, 다른 사람 풀이처럼 bj와 one, 비교된 one1과 two를 비교하여 더 간단하게 풀 수도 있다는 것을 알았습니다.비슷한 코드더라도 비교하는 순서에 따라 코드의 간결성이 달라질 수  있다는 점을 알았으며, 앞으로는 어떤 비교 방법이 더 손쉬운 코드를 짤 수 있을지에 대해 고민하면서 코드를 작성할 것입니다.

 

 

 

 

[github] - FoodBj.js

https://github.com/yh725k/javascript.git