머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order
가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.
order
≤ 1,000,000order | result |
---|---|
3 | 1 |
29423 | 2 |
입출력 예 #1
입출력 예 #2
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를 하는 방식으로 해주었다.
더 간결하고 변수를 하나 더 만들지 않아도 되서 성능면에서는 더 좋다.
*/
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을 할수있도록 간략하게 만들어주었다.
속도는 변수 생성 없는 이 방법이 더 빠르다.*/
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 을 생략해주었다. */