본문 바로가기

백준/JavaScript

[JS] 백준 약수, 배수와 소수 - 2581번

728x90

 

으... 어제 아침부터 목이 안 좋더니..

결국 감기에 걸렸다...

오늘 하루종일 멍하고 추웠다.

분명 목만 까끌거렸는데 이제는 콧물이랑 코막힘.. 그리고 재채기까지 동반한다.

(힝... 아빠한테 목감기 약만 부탁했는데...)

 

 

머리도 어지럽고... 오늘 문제는 쉬워보이니까 얼른 끝내야지하고 생각했는데...

너무 오래걸렸다. 자꾸 이상하게 생각하고 오타를 냈기 때문이다.

그래도 내가 작성한 풀이를 알맞게 수정하고 싶어서 여러 가지 찾아보았다.

 

일단 오늘의 문제는 이거다.

 

문제 2581번

https://www.acmicpc.net/problem/2581

 

2581번: 소수

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.  단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

www.acmicpc.net

 

처음에는 입력받을 때 N과 M을 자꾸 바꿔서 썼다. 그래서 한참 있다가 찾아서 이제는 맞겠지 했지만, 자꾸 틀렸다.

그렇게 보던 중... 나는 충격적인 사실을 알아냈다. 그건... 반복문을 빠져나가기 위해 break를 써야하는 부분에 함수 실행을 종료하고 주어진 값을 함수 호출 지점으로 반환하는 return을 썼다...

내가 처음에 작성한 코드는 반복문을 다 돌아도 i%j가 0이 아니라서 소수인 것이 확정되면 break 안 하고 그 다음으로 넘어가 해당 i를 배열에 넣어줬는데, 출력해보니 아무것도 들어가지 않은 것을 확인할 수 있었다.

 

다른 블로그를 참고해보니 반복문 앞에 out, inner을 쓴 것처럼 반복문에 label을 달아서 해당 반복문에 대하여 break나 continue를 실행한다고 한다. 그래서 그 방법을 사용하니 맞았다는 문구가 떴다. label붙이는건 예전에 해봤는데 생각을 못했네...

 

const readFileSyncAdress = process.platform === 'linux' ? '/dev/stdin':'./input.txt'
const [N,M] = require("fs").readFileSync(readFileSyncAdress).toString().trim().split('\n').map(x=>Number(x));

let nums = [];
let sum=0;
out : for(let i=N;i<=M;i++){
    if(i<2){
        continue;
    }
    inner : for(let j=2;j<i;j++){
        if(i%j===0){
            continue out;
        }
    }
    nums.push(i);
    sum+=i;
    
}

if(nums.length===0){
    console.log(-1);
} else{
    console.log(sum);
    console.log(nums[0]);
}

 

 

 

 

[참고] https://velog.io/@rkio/%EB%B0%B1%EC%A4%80-Javascript-2581

 

 

으... 콧물때문에 집중이 안된다...

감기 조심하세요...

728x90