😊 Solution 1) 마지막에 0을 받으면 끝나도록 while loop을 돌려줬다. 1929번 문제에서 M, N을 여기서는 n = 입력 받은 값, m = n * 2로 구간을 설정해줬다. 또한, 값을 판단하기 위해 선언하는 Array에서, 구간을 벗어나는 index에 false를 세팅해주고 시작하면 된다. (0보다 크고 n보다 작거나 같을 때까지)
추가 Solution 2) 코드 개선 전체 입력을 반복하는 반복문은 for ... of로 대체하였으며, 첫 째 줄에 0을 받으면 break하도록 설정하였다. n보다 크고 2n보다 작거나 같아야 하므로, 구간은 n+1부터 2n까지라고 보면 된다. 따라서 n=num+1, m=2*num으로 구간을 선언해주었다. 마찬가지로, m+1만큼 Array를 선언해준 후 fill(true)로 채워줬다. (index 0과 1은 false로 채워줬다) 이제 에라토스테네스의 체 방법으로 소수를 구해주고, n부터 m까지 소수가 있다면 count 후 counter를 출력해줬다.
😊 에라토스테네스의 체 방법으로 소수를 구하는 문제다. 소수를 구하면, 그 소수의 배수는 소수가 될 수 없다. 그래서 그 배수들을 사전에 제거하고 남은 수를 이용해 소수를 구하는 방법이다.
먼저, (1 ≤ M ≤ N ≤ 1,000,000)이므로 MAX를 선언해준다. 그리고 소수를 판단할 isPrimeArr(Array)를 N+1만큼 선언해준다(인덱스를 N까지 사용할 것이므로) isPrimeArr는 .fill()을 이용해 모두 true값으로 세팅해줬다. 그리고 0과 1은 소수가 아니므로 false를 세팅해줬다.
for loop을 돌리면서 해당 소수의 배수는 false로 값을 바꿔준다. 그리고 조건문을 이용해 우리가 구할 숫자를 넘어가면 break; 내부 for loop에서 for조건문의 마지막을 넣지 않았는데, 그 안에 square += i를 넣어줘도 된다. 같은 의미다(배수를 계속 더해줌)
마지막에 입력 받은 구간만큼 for loop을 이용해 출력해주면 된다(isPrimeArr이 true면 소수)
아래 링크를 참고하면 이론과 함께 시각적으로 어떻게 진행되는지 볼 수 있어 좋다. 좋은 참고자료!
😊 최솟값을 구해주기 위해 Array를, 소수값의 합을 구해주기 위해 sum 변수를 추가했다. 소수를 구하는 부분은 function으로 따로 빼주었으며, function내에서 소수를 찾으면 arr에 push함과 동시에 소수들을 sum에 누적해 줬다. 그리고 마지막에 만약 Array.length가 없다면 소수는 없는 것이므로 -1을 출력하도록 했다.
😊 따로 function을 만들어서 풀었다. 0 또는 1은 소수가 아니므로 if(n < 2) 조건문을 걸어 return;했고, 2부터 자기 자신-1까지 나눠주면서 나머지가 0된다면 소수가 아니므로 return; 위의 조건에 모두 해당되지 않는다면, 해당 숫자는 소수이므로 counter++;
기본적으로, Math.random()은 0 ~ 0.999...까지 값을 얻을 수 있다(1은 포함되지 않는다) 하지만, 위 코드처럼 max값을 곱해주면 0 ~ 2.999...까지 값을 얻을 수 있다(3은 포함되지 않는다) 이렇게 범위를 정해서 내가 원하는 random 값을 받아볼 수 있다.
📌 만약 1부터 3까지 값을 받고 싶다면?
Math.ceil( Math.random * 최대 범위 ) 위와 같이 ceil(올림) method를 사용해주면 된다(여러가지 다른 방법도 있다)
console.log( Math.ceil(Math.random() * 3) );
📌 function을 사용하여 간편하게 이용하는 방법도 있다.
function getRandomInt(max){ return Math.floor( Math.random() * max ) + 1; }
const max = 3;
console.log( getRandomInt(max) );
위 function에서는 Math.floor( Math.random() * max ) + 1; 로 작성했다. 즉, 0 ~ 2.999...범위의 random 숫자를 버림(floor)해주고 +1을 더해 주는 방식이다. 이렇게 작성해도 1~3까지 범위의 random 숫자를 받아볼 수 있다.
😋 기본적으로 구구단 게임이라든지, 무언가 변칙적인 개발이 필요할 때 자주 사용되는 method! 종종 쓰이기 때문에, 한 번 잘 이해해두고 앞으로 쉽게 사용하자.
😊 문제의 의도는 a-1층의 1호부터 b호까지 모두 더하라는 것이 아닐 것이다. 물론 더해도 된다. 하지만 시간이 오래 걸린다.
1
6
21
56
126
1
5
15
35
70
1
4
10
20
35
1
3
6
10
15
1
2
3
4
5
예를 들기 위해, 4층, 1-5호까지 있는 아파트를 표로 작성해봤다(참고로 층은 0부터 시작한다) 어떤 패턴이 있는지 잘 살펴보면, [a행, b열]에 있는 값은 [a행, b-1열] + [a-1행, b열]의 값으로 이루어져 있다.
또한, 가장 아래 행의 각 열은 1부터 b까지 1씩 순차적으로 증가하는 값을 가지며, 왼쪽의 첫 번째 열은 항상 1 값만 갖는다.
입력으로 a=2, b=3을 받았다고 가정해보자 [2, 2] == 4, [1, 3] == 6이라는 것을 알 수 있고, 이 값을 더하면 4+6=10. 곧, [2, 3]의 값이다. 이 패턴을 가지고 코드를 작성해보면 위의 코드가 나온다.
외부 for loop에서 배열을 항상 [1]부터 시작하도록 초기화해준다. 내부 for loop에서는 가장 아래 행이면 1씩 증가하도록 if 조건문을 걸어주고, 그 외경우는 위의 [a행, b-1열] + [a-1행, b열] 패턴에 맞도록 값을 저장해준다. 그리고 마지막에 알고 싶은 층과 호수를 배열의 인덱스에 넣고 찾아주면 된다.