오늘 뭐했냐/기억하면 좋을 문제들

for문에서 특정 숫자로 반복이 필요할 때

스스로에게 2023. 6. 15. 16:01

소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 * 2 * 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

  1. 중복된 값이 없어야 하니까 Set에 담자 
  2. 2부터 나눠보고 2로 안나눠질 때까지 한다음에 3으로 나눠보는 식으로 반복 
  3. 나중에 배열 안에 Set 풀면 되겠네 
function solution(n) {
    const result =new Set()

for(let i=2;i<=n;i++){
    if(n%i===0){
        result.add(i)
        n/=i
        i=2 // 이게 문제 1로 바꾸면 해결    
    if(n<=1) break;
    }
}
    return [...result]
}
  • 몇 번 테스트 했을 때 문제가 없었다 하지만 채점과정에서 몇 번 실패가 나옴  왜???
  • 몇몇의 테스트에서만 문제가 생기니 다른 사람들의 코드와 비교해보자 => 대부분 While문을 사용했다 특정 숫자의 반복 계산을 했다 
function solution(n) {
    const answer = new Set()

    while (n > 1) { // 위에 n===1일 때 break와 같음
         for (let i=2; i<=n; i++) { // 동일
             if (n % i === 0) { // 동일
                 answer.add(i) // 동일
                 n /= i // 동일
                 break
             }
        }
    }
    return Array.from(answer) // 스프레드 문법과 결과 같음
}

그래서 i가 문제인건 찾았는데 어떻게 바꿔야하고 왜 저런 결과가 나올까

결국 찍어봐야지 내가 짠 코드에서는 4가 들어가는 것을 발견, 왜 4가 들어갈까

이것도 찍어봤다 i=2로 했는데 반복문을 마치고 i++에 의해 3이 되는 것이다 

 

그래서 i=1로 초기화를 하면 해결이 되었다 

'오늘 뭐했냐 > 기억하면 좋을 문제들' 카테고리의 다른 글

객체 구조를 활용한 배열 빼기  (0) 2023.06.16
Set 자료구조로 문자열 전달  (0) 2023.06.15
indexOf()  (0) 2023.06.15
스코프 활용  (0) 2023.06.15
대소문자 반대로  (0) 2023.06.14