문제 설명

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


제한사항

  • 1 ≤ order ≤ 1,000,000

입출력 예

orderresult
31
294232

입출력 예 설명

입출력 예 #1

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

입출력 예 #2

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

✍ SOLUTION1

const solution = (order) => {
    const num = ["3", "6", "9"];
    
    return Array.from(String(order)).filter(x=> num.includes(x)).length;
}

/* 
내가 처음 작성했던 코드이다. 

1. 배열에 '3', '6', '9' 를 만들어 num변수에 넣어주었다.
2. 매개변수 order는 숫자타입으로 들어오기 때문에 Array.from 해주면 빈배열이 출력된다.
그러므로 Array.from에 String으로 타입 변환해준 order를 넣어주었다.
3. filter메서드를 통해서 filter(x=> num.includes(x)) true한 값을 추출한 후 length로
길이 체크 후 return 해주었다.
*/
const solution = (order) => 
Array.from(String(order)).filter(x => ['3', '6', '9'].includes(x)).length;

/* 
위의 코드를 제출하고 보니 더 간략하게 쓸수있는 방법을 알게되어 작성해보았다.
같은 코드인데 num변수를 만들지 않고 filter안에 ['3', '6', '9']를 바로 작성하여 
includes를 하는 방식으로 해주었다.
더 간결하고 변수를 하나 더 만들지 않아도 되서 성능면에서는 더 좋다.
 */

✍ SOLUTION2

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

/*
다른 분의 풀이를 보다가 정규표현식으로도 풀수 있는 방법이 있어서 공부할겸 가져와 보았다.

1. [...order.toString(): order를 숫자 타입에서 문자열로 바꿔준다. 
2. matchAll(/[3|6|9]/g)]: 문자열에서 '3', '6', '9' 중 하나라도 포함되어 있는 부분을 모두 찾는다.
여기서 사용된 /[3|6|9]/g는 정규 표현식이다. 
이 정규 표현식은 문자열에서 '3', '6', '9' 중 어느 것이라도 있는 부분을 모두 찾아내는 역할을 한다. 
그리고 g 옵션은 전체 문자열에서 계속해서 찾으라는 의미이다. 
matchAll() 함수가 반환하는 것은 반복 가능한 객체(iterator)인데, 이를 배열로 바꿔주기 위해 
[...iterator]와 같이 스프레드 연산자(...)를 사용한다. 
3. 마지막으로 .length를 사용하여 찾아낸 '3', '6', '9'의 개수(즉, 박수 치는 횟수)를 구한다.
4. return answer: 위에서 구한 결과값인 박수 치는 횟수 (answer) 를 반환한다.
*/
const solution = (order) => 
[...order.toString().matchAll(/[3|6|9]/g)].length;

/* 위의 코드를 answer 변수 생성 없이 바로 return을 할수있도록 간략하게 만들어주었다.
속도는 변수 생성 없는 이 방법이 더 빠르다.*/

✍ SOLUTION3

function solution(order) {
  return order
    .toString()
    .split("")
    .filter((v) => v === "3" || v === "6" || v === "9").length;
}

/* 
이것도 다른분의 풀이를 보다가 가져와봤다. 
SOLUTION2 코드와 동일한 기능을 수행하지만, 정규 표현식 대신 filter() 메서드를 사용하였다.

1. return order.toString(): 주어진 숫자 order을 문자열로 변환해준다.
2. split(""): 문자열을 각각의 문자로 분리하여 배열로 만든다.
3. filter((v) => v === "3" || v === "6" || v === "9"): 
이 배열에서 각 요소 v가 '3', '6', '9' 중 하나인지 확인한다. 만약 해당한다면 그 요소는 
새 배열에 포함된다. 
4. length: 마지막으로 이렇게 필터링된 배열의 길이(즉, 3, 6, 9의 개수)를 구한다.  
*/
const solution = (order) => 
order.toString().split("")
.filter((v) => v === "3" || v === "6" || v === "9").length;

/* 위의 코드를 화살표 함수로 바꿔주어 return 을 생략해주었다. */

출처 : 프로그래머스 스쿨 | 코딩테스트 연습

0개의 댓글