백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 1011 , Fly me to the Alpha Centauri
풀이 시간
Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하
<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
<덧붙일 말>
솔루션을 봤으나 그 솔루션대로 풀지 않고 규칙을 찾아 스스로 풀었음.
나열해서 보면 금방 보인다. (단, 정확히 나열할 것.)
문제 출처
https://www.acmicpc.net/problem/1011
풀이
직접 16까지 나열해 본 경우이다.
여기까지 봤을때 규칙이 보이시나요? 그러면 이제 그 규칙을 코드로 구현만 해주시면 정답입니다.
규칙이 안보이신다고요?
그럼 같이 확인해봅시다.
1 은 1자리
2 는 2자리
입니다. 한개씩 증가하였네요
그다음을 봅시다
3은 3자리 다음 4는 4자리일까요?... 했더니 3자리네요?
3 은 3자리
4 도 3자리
다음 5는 또 4자리로 늘어났네요
그다음 6도 4자리.
그럼 7은 5자리겠지...? 라고 뭔가 의심이 됩니다.
역시 7은 5자리네요
8도 5자리
자 9가 관건인데, 5자리일까요 6자리일까요?
9는 증가하지않고 5자리네요
여기까지 보면 이제 규칙이 약간 보입니다.
정리해볼까요?
1 | 1 |
2 | 2 |
3 | 3 |
4 | 3 |
5 | 4 |
6 | 4 |
7 | 5 |
8 | 5 |
9 | 5 |
오른쪽을 보면 한개씩 증가하고는 있는데 그 주기가 1씩 늘어나고 있습니다.
1 => 1
2 => 2
3,4 => 3
5,6 => 4
7,8,9 => 5
이렇게요.
그러면 한번 예상을 해볼까요? 지금까지 나온대로의 숫자들을 가지고 다음 수를 예상해보면,
10, 11, 12 는 6자리 가 나올 거 같은데 어떠신가요.
실제로 6자리가 나옵니다!!! 그러면 점점 확실해지죠?
그럼 더 예측해봅시다.
13 14 15 16 은 7자리가 나오겠죠?
덤으로 17, 18, 19, 20 은 8자리?
실제로 몇개만 해보면 실제로 맞습니다.
이제까지의 모든 결과를 가지고 한번 규칙을 세워보겠습니다.
순번 0, 길이 값 0, 주기의 초깃값 1 을 잡습니다.
이후 위에서 보면 주기의 두배에 해당하는 범위 이내에서 길이가 1씩 두번 증가합니다.
예를들어 주기가 2라면
3~4 범위에서 길이 한번, 5~6 범위에서 길이가 각각 한번씩 증가하는 것이죠.
주기가 3이라면
7~9 범위에서 길이가 한번, 10~12 범위에서 길이가 하나 증가하고요.
순번은 문제에서 주어지는 두 값의 차이 만큼이니까 0부터 그 차이값까지 증가시켜주면 되겠군요.
그럼 while 문을 1부터 차례대로 그 차이값 이하까지만 쭉 돌려줍시다.
num이라는 숫자는 주기만큼 증가하게 되고 그 범위 이내의 숫자들을 길이가 하나씩 증가합니다.
그리고 한번 체크합니다. 우리가 확인해야될 숫자가 이 범위를 초과하거나 같은지를.
초과하거나 같다면 지금까지 늘어난 길이를 리턴시켜줍니다.
아직 이하 값이라면 주기만큼 더 늘려줍니다. 그러면 길이도 하나 또 늘겠죠?
이렇게 두번 하게되면, 이제 규칙에 따라서 주기를 1 또 증가시켜줘야 합니다.
말로 하니까 헷갈리죠?
간단히 보면
+ 1 길이 1 증가
숫자 확인
+ 1 길이 1 증가 , 주기 1 증가
숫자 확인
+ 2 길이 1 증가
숫자 확인
+ 2 길이 1 증가 , 주기 1 증가
숫자 확인
+ 3 길이 1 증가
숫자 확인
+ 3 길이 1 증가 , 주기 1 증가
.
.
.
.
이런 식으로 쭉 늘려가면서 범위를 벗어나는 지를 확인 하는 겁니다.
이 과정을 반복하면 원하는 값을 얻을 수 있습니다.
마지막으로 이해를 더 돕기 위해 표로 정리해보겠습니다
이렇게 정리할 수 있겠습니다.
정답
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const T = input.shift();
const space = input.map((v) => v.split(" ").map(Number));
function solution(T, space) {
let arr = [];
const check = (V) => {
let [num, line, range] = [0, 0, 1];
while (num < V) {
[num, line] = [num + range, line + 1];
if (num >= V) return line;
[num, line, range] = [num + range, line + 1, range + 1];
}
return line;
};
space.map((v) => {
let [a, b] = v.map(Number);
let tmp = b - a;
arr.push(check(tmp));
});
arr.map((v) => console.log(v));
}
solution(T, space);
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 11478 , 서로 다른 부분 문자열의 개수 (0) | 2022.10.12 |
---|---|
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 15686 , 치킨 배달 [DFS] (0) | 2022.10.09 |
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 2096 , 내려가기 [DP] (1) | 2022.10.07 |
백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 24499 , blobyum [슬라이딩 윈도우] (0) | 2022.10.06 |
백준/ Silver 4 문제 , 백준 Node.js 자바스크립트 12847 , 꿀 아르바이트 [슬라이딩 윈도우] (1) | 2022.10.05 |