JavaScript/알고리즘

프로그래머스 369게임 JS ( 반복문 사용을 위해 number를 이터러블한 타입으로 변환하기 )

hihiha2 2023. 7. 6. 15:37

문제 설명

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

 

🙋‍♀️ 내 생각

order의 타입은 number이다.

order에 3,6,9를 포함하는지 검사한 뒤, 원하는 처리를 하기 위해서는 for문이나 map과 같이 반복문을 써야하는데, 반복문은 string이나 array와 같이 이터러블하여 순회가 가능한 타입에만 사용할 수 있다.

따라서 이 문제를 풀기 위해서는 number타입으로 들어오는 매개변수를 이터러블한 값으로 먼저 바꾼 뒤 풀어야한다.

타입만 변경하고 나면 그 뒤에는 3,6,9가 나올때만 count를 올려가든, 아니면 3,6,9만 남겨서 length를 구하든 여러가지 방법으로 풀 수 있다.

 

 

✅ 내 코드

function solution(order) {
    let count = 0;
    let arr=String(order).split("")
    
   for(let i=0; i<arr.length; i++){
       if(arr[i]==="3"||arr[i]==="6"||arr[i]==="9"){
          count += 1
       }
   } return count
}

나는 3,6,9가 있을때 count에 +1을 하는 방식으로 풀었다.

 

우선 값을 더해줄 count라는 변수를 선언하고 0으로 값을 초기화해준다.

 

그런다음, order를 활용하기 위해서 이터러블한 값으로 바꾼다.

arr라는 이름으로 변수를 선언하고 order를 String타입으로 변경한 뒤, split("")을 통해서 각각 글자가 나뉘어진 형태로 배열로 만들었다.

arr를 리턴하여 확인하면, 값이 아래와 같이 담기는 것을 볼 수 있다. 

(split("")을 하였기때문에 각각 나뉘어서 배열에 담긴 것이다.)

 

다음으로 order의 각 요소를 순회하면서 검사하기위해서 for문을 사용했다. 

if문을 사용해서 만약 arr[i]가 "3","6","9"라면, count을 +1하도록 한다.

 

이렇게해서 for문을 통해서 배열을 돌면서 검사하고, 369를 만날때만 count에 +1을 한다.

 

 

 

 

 

💻  다른사람 코드중에 배울 것 1

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

 

match를 통해서 3,6,9와 일치하는 부분만을 구하여 length를 통해서 몇개인지를 구하는 코드이다.

 

 

🔫 match(): 메서드는 문자열이 정규식과 매치되는 부분을 검색

str.match(regexp)

반환값: 배열

 

match는 일치하는 부분을 배열로 반환한다는 점을 주의해야 할 것 같다.

이 문제는 length를 구하는 문제라서 사실상 상관없지만, 다음에 문제를 풀때 알아두면 좋을것같아서 정리하였다.

 

위의 코드를 통해서 테스트해보면, 아래와 같이 해당하는 값들이 배열로 반환되는 것을 확인할 수 있다.

 

이렇게 match를 통해서 구하고나서, length를 통해서 개수를 구한다.

 

 

 

 

 

💻  다른사람 코드중에 배울 것  2

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

order을 string타입으로 바꾸고 split('')을 통해서 각각 나누어서 배열에 담는 것은 동일하다.

(반복문을 사용하기 위해서 타입을 변환함, number타입은 이터러블하지 않기때문에)

 

그런 다음 filter를 사용해서 "3","6","9"를 포함하는 것만을 남긴 뒤, length를 통해서 개수를 구한다.

 

 

 

🙋‍♀️ 내 생각

이 문제는 제일 처음에 적은 것처럼, 이터러블하지 않은 number타입을 순회하면서 검사하고 원하는 처리를 하기 위해서 타입을 이터러블하게 변환하는 점이 핵심이라고 생각했다. 

그래서 검사를 할때도 그냥 3이라고 적는것이 아니라, "3"이라고 적어주는 것이 중요하다.

문제를 풀면 풀수록 알맞은 메서드를 사용하기 위해서 타입을 잘 변환하고 다루는 것이 중요한것 같다는 생각이 든다.