뚝딱햄 탈출기

[JavaScript] 엘리스 트랙 - 소수의 합 본문

Algorithm & Data structure/알고리즘 문제 풀이

[JavaScript] 엘리스 트랙 - 소수의 합

hyrmzz1 2023. 8. 10. 12:43

소수의 합 구하기

1부터 200사이의 소수의 합을 구해봅시다.

지시사항

반복문과 조건문을 이용해 1이상 200이하의 자연수 중 소수를 판별하고, 그 합을 구해 solution 함수 안에서 return 하세요.

Tips!

소수는 1과 자기 자신만을 약수로 가지는 수

내 오답

 // 지시사항을 참고하여 solution 함수 안에 코드를 작성하세요. 
function solution() {
	let sum = 0;
	let i, j;
    
	for (i = 2; i <= 200; i++){ 	// 1은 소수가 아님.
		for (j = 2; j < i; j++){	// 소수는 1과 자기자신 외에 나누어 떨어지지 않으므로 2와 자기자신보다 작은 수 사이에서 약수 찾음.
			if (i % j === 0){	// 2와 자기자신-1 사이의 수 중 약수가 있으면 소수 X. 
				break;	// for 문 종료, i++.
			} else {
				sum += i;
			}
		}
	}
	return sum;
}

// 실행 혹은 제출을 위한 코드입니다. 지우거나 수정하지 말아주세요.
module.exports = solution;

오답 원인

약수가 없을 경우 (= else) sum += i; 후에 j++ 되는데, 여기서 sum += i; 를 하면 i의 약수가 아닌 j 가 나올 때마다 sum += i 발생.
=> ex) i = 15 이면 j  = 2 일 때 sum += i; 발생. i = 25이면 j = 2, 3, 4 일 때 sum += i; 발생.
=> else 블록 내부에서 sum += i; 수행하면 안된다.

정답

 // 지시사항을 참고하여 solution 함수 안에 코드를 작성하세요. 
function solution() {
	let sum = 0;
	let i, j;
    
	for (i = 2; i <= 200; i++){ 	// 1은 소수가 아님.
		let isPrime = true;
		for (j = 2; j < i; j++){	// 소수는 1과 자기자신 외에 나누어 떨어지지 않으므로 2와 자기자신보다 작은 수 사이에서 약수 찾음.
			if (i % j === 0){	// 2와 자기자신-1 사이의 수 중 약수가 있으면 소수 X. 
				isPrime = false;	// 소수가 아니면 변수 isPrime의 값을 false로 바꿈.
				break;	// for 문 종료, i++.
			}
		}
		if (isPrime){
			sum += i;	// isPrime이 참일 때만 수행.
	}
	return sum;
}

// 실행 혹은 제출을 위한 코드입니다. 지우거나 수정하지 말아주세요.
module.exports = solution;

isPrime 이란 변수를 생성하고, boolean 값으로 소수 판별.

판별 후 소수의 합을 sum 에 넣기.

정답 2 - 사이트 제공 답안

function solution() {
	var sum = 0;

	for (var i = 1; i <= 200; i++) {
		for (var j = 2; j < i; j++) {
			if (i % j == 0) {
				break;
			}
		}
		if (j == i) {	// i % j != 0 인 경우에만 수행됨.
			sum += j;
		}
	}

	return sum; 
}

isPrime 이라는 새로운 변수를 생성하지 않는다.

j의 범위를 2부터 자기자신 - 1 까지로 지정했고, i % j == 0 이면 break문으로 인해 for ( var j ~)문 종료되고 i++.

if (j == 1) {sum += j;} 문은 if (i % j == 0) {break;}문이 거짓일 때 (= 2와 자기자신 - 1 사이의 수 중 약수가 없을 때) (= 소수일 때) 수행됨.

if (j == 1) {sum += j;} 문은 for (var j ~) 문이 break; 문에 도달하지 않고 종료되었을 때 수행.

=> j < i; j++ 이므로 j === i

이 문제에서 기억할 것

1은 소수가 아니다.

for 문 내부의 if 문에서 break;를 하더라도 for문이 종료된다. (if문 종료 아님)

isPrime 같이 필요에 의해 변수를 새로 생성하는 방향으로도 풀이할 수 있다.

 

Comments