본문 바로가기
Algorithms/코테 문풀

[프로그래머스] 369 문제 - JavaScript 풀이

by hi-rachel 2023. 1. 4.

✏️ 문제 설명

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.


제한사항
  • 1 ≤ order ≤ 1,000,000

 

입출력 예
order result
3 1
29423 2

 


입출력 예 설명

입출력 예 #1

  • 3은 3이 1개 있으므로 1을 출력합니다.

입출력 예 #2

  • 29423은 3이 1개, 9가 1개 있으므로 2를 출력합니다.

 

✏️ 문제풀이

- 내 풀이

function solution(order) {
    let clap = 0;
    const game = ['3', '6', '9'];
    const orderList = order.toString().split('');
    for (let num of orderList) {
        if (game.some(n => num.includes(n))) {
            clap++;
        }
    }
    return clap;
}

1. 예를 들어 order 값 123을 ['1', '2', '3'] 이런 식으로 배열로 나눠주기 위해서 order.toString().split('') 이용.

더보기

String.prototype.split() 메서드는 패턴을 받아 패턴을 검색하여 문자열을 정렬된 하위 문자열 목록으로 나누고 이러한 하위 문자열을 배열에 넣고 배열을 반환한다.

 

[참고] 2023.01.04 - [JavaScript] - [Js] split(), split(''), split(' ')의 명확한 차이

 

2. orderList의 배열의 각 요소의 모든 경우를 확인하기 위해 반복문 사용.

 

3. orderList에 game['3', '6', '9']의 각각의 요소가 들어있는지 확인하기 위해서 includes() 메서드를 사용했고,

includes() 안에 여러 요소를 한 번에 집어넣어 확인할 수 없기 때문에 some() 메서드를 같이 이용해 풀었다.

 

더보기

▶ Array.prototype.includes()

배열이 항목 중 특정 값을 포함하는지에 따라 true 또는 false를 반환한다.

// includes() Syntax
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
includes(searchElement)
includes(searchElement, fromIndex)

 

Array.prototype.some()

some() 메서드 배열의 적어도 하나의 요소가 제공된 함수에 의해 구현된 테스트를 통과하는지 여부를 테스트한다. 요소를 찾으면 true를 반환, 아니면 false를 반환하고 array를 수정하진 않는다.

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some
const array = [1, 2, 3, 4, 5];

// Checks whether an element is even
const even = (element) => element % 2 === 0;

console.log(array.some(even));
// expected output: true

// some() Syntax
// Arrow function
some((element) => { /* … */ })
some((element, index) => { /* … */ })
some((element, index, array) => { /* … */ })

// Callback function
some(callbackFn)
some(callbackFn, thisArg)

// Inline callback function
some(function (element) { /* … */ })
some(function (element, index) { /* … */ })
some(function (element, index, array) { /* … */ })
some(function (element, index, array) { /* … */ }, thisArg)

 

- 다른 풀이(참고)

정규표현식을 이용하면 더 간단하게 369를 표현할 수 있다.

/[3|6|9]/g => 3이나 6이나 9인 [] 집합

// 1
function solution(order) {
    var answer = [...order.toString().matchAll(/[3|6|9]/g)].length;
    return answer;
}

// 2
function solution(order) {
    return (''+order).split(/[369]/).length-1;
}

// 3
function solution(order) {
    return Array.from(order.toString()).filter(t => ['3', '6', '9'].includes(t)).length;
}

- string을 array로 바꿔주기 위해 사용하는 Array.from() 정적 메서드반복 가능하거나 배열과 같은 객체에서 얕은 복사본인 새로운 Array 인스턴스를 만든다.

⇒ 위 풀이에서 order를 굳이 왜 string(toString())으로 만들어줬나 했는데 Array.from() 메서드는 반복 가능(iterable)하거나 배열과 같은 객체에서 사용하기 때문에 string으로 만들어준 것 => 이터러블(iterable)객체는 일종의 배열, 문자열, 세트, 맵.  (+ for/of 루프로 순회 가능)

 

+ 필터링

더보기

Array.prototype.filter()

filter() 메서드는 제공된 함수에 의해 구현된 테스트를 통과하는 주어진 배열의 요소로만 필터링된 지정된 배열 부분의 얕은 복사본(shallow copy)을 만든다.

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]

// filter() Syntax
// Arrow function
filter((element) => { /* … */ })
filter((element, index) => { /* … */ })
filter((element, index, array) => { /* … */ })

// Callback function
filter(callbackFn)
filter(callbackFn, thisArg)

// Inline callback function
filter(function (element) { /* … */ })
filter(function (element, index) { /* … */ })
filter(function (element, index, array) { /* … */ })
filter(function (element, index, array) { /* … */ }, thisArg)

 

참고 사이트

mdn

some()

 

Find single or array of values in JavaScript array using includes - gavsblog

Find out whether a JavaScript array contains single or multiple values by passing an array of values to includes() with the help of some() and every().

www.gavsblog.com

 

 

[프로그래머스 머쓱이 DAY 14일 차] 머쓱이는 0 레벨이지만 매일 꾸준히 3문제씩 풀어보니 계속 사용되는 코드가 보이고 중요성이 느껴진다. 계속 찾아만 보지 말고 이렇게 정리해서 내 것으로 만들기 위해 노력 중이다! 파이썬 >>> 자바스크립트로 코딩테스트 언어를 옮겨 열심히 공부 중 👊🏻👊🏻 

 

😃 공부하면서 적는 글입니다. 잘못된 점이 있다면 피드백 남겨주시면 감사합니다.