▶every() & ▶거듭제곱 연산자(**)를사용한 간단한 문제가 있어서 정리해보고자 합니다.
문제설명
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 이하의 정수입니다.
입출력 예 & 설명
- 입출력 예 #1
- 예제 1번에서 네 주사위 숫자가 모두 2로 같으므로 1111 × 2 = 2222점을 얻습니다. 따라서 2222를 return 합니다.
- 입출력 예 #2
- 예제 2번에서 세 주사위에서 나온 숫자가 4로 같고 나머지 다른 주사위에서 나온 숫자가 1이므로 (10 × 4 + 1) 2 = 412 = 1681점을 얻습니다. 따라서 1681을 return 합니다.
- 입출력 예 #3
- 예제 3번에서 a, d는 6으로, b, c는 3으로 각각 같으므로 (6 + 3) × |6 - 3| = 9 × 3 = 27점을 얻습니다. 따라서 27을 return 합니다.
- 입출력 예 #4
- 예제 4번에서 두 주사위에서 2가 나오고 나머지 다른 두 주사위에서 각각 5, 6이 나왔으므로 5 × 6 = 30점을 얻습니다. 따라서 30을 return 합니다.
- 입출력 예 #5
- 예제 5번에서 네 주사위 숫자가 모두 다르고 나온 숫자 중 가장 작은 숫자가 2이므로 2점을 얻습니다. 따라서 2를 return 합니다.
나의 풀이
let arrS = [...new Set(arr)];
const maxNum = Math.max(...arrS);
const minNum = Math.min(...arrS);
for(let i = 0 ; i < arr.length ; i++){
for(let j = i+1 ; j < arr.length ; j++){
if(arr[i] === arr[j])cnt++;
}
}
if(cnt === 3) return (10 * maxNum + minNum)**2
처음에는 문제를 잘못이해하여 위와같이 이중 for문을 사용하여 하나의 cnt로 컨트롤하고자 했지만 그러면 maxNum과 minNum이 틀린 경우가 너무 많아서 계속해서 실패했습니다.
솔직히 반례를 찾지못해서 너무나 헷갈렸습니다..
이중 for문을 이용한 하나의 cnt로 분기처리를 했을 때는 3개의 숫자가 같을 때 아래와 같이 결과가 나오게 됩니다.
그렇기 때문에 max값의 cnt와 min값의 cnt를 각각 해줘야 합니다.
코드의 설명을 하자면 먼저 Math.max & Math.min 메서드를 사용해서 arr배열의 max값과 min값을 구해주고, 큰 수와 작은 수의 개수를 구한 변수를 선언해 줍니다.
그리고 arr배열을 forEach() 문을 사용하여 순환해 주면서 maxCount와 minCount를 증감시켜 줍니다.
그러면 p값과 q값 & p의 개수 q의 개수를 알 수 있습니다.
그리고 every() 함수를 사용해서 arr배열의 각요소가 a와 같다면으로 조건을 걸어주고, 반환값이 true이면 4개의 숫자가 모두 같다는 뜻 즉 maxCount와 minCount가 4라는 뜻이기 때문에 문제에서 정의한 대로 연산을 해줍니다.
❗ ❗
3개의 주사위 숫자가 같을 때는 문제의 정의대로 연산을 해주는 데 제곱 연산자(**)를 사용해 주었습니다.
이 부분이 제일 중요하다고 생각합니다. 위에서 말했듯이 2개의 Count를 사용하지 않으면 이상한 값이 나오기 때문입니다.
❗ ❗
2개의 주사위 숫자쌍이 같을 때는 같은 abs() 메서드를 사용하여 절댓값을 구해주고, 2개의 주사위 숫자가 같고 나머지 두 주사위 숫자가 다를 때 (p!= q)는 p와 q를 하나씩 찾아 곱해주었습니다.
마지막으로 4개의 숫자가 모두 다르다면 가장 작은 min값을 리턴해주고 마무리했습니다.
[JavaScript] Array every(), some() 함수 알아보기
배열이 특정 조건을 만족하는지 확인하고자 하는 경우가 있습니다. 이때 사용하는 함수에는 every()와 some()이 있습니다. Array.every() Array.every() array.every(callbackFunction(currentValue, index, array), thisArg) cur
pixx.tistory.com
[JavaScript] 거듭제곱 알아보기
JavaScript에서 거듭제곱을 구하는 방법은 크게 3가지가 있습니다. n*n JavaScript 내장함수인 Math.pow() ES6 문법의 (**) 1. n * n 일반적으로 가장 기본적인 구문입니다. 주어진 숫자를 그냥 곱해서 제곱근
pixx.tistory.com
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 캐릭터의 자표 (JavaScript) (1) | 2024.02.25 |
---|---|
[프로그래머스] 정수를 나선형으로 배치하기 (JavaScript) (1) | 2024.02.24 |
[프로그래머스] 배열 조각하기 (JavaScript) (0) | 2024.02.22 |
[프로그래머스] 배열 만들기 2 (JavaScript) (0) | 2024.02.21 |
[프로그래머스] 전국 대회 선발 고사 (JavaScript) (0) | 2024.02.20 |