-
[백준 Node.js/Javascript] 2869번 달팽이는 올라가고 싶다.To infinity/Coding Practice 2021. 6. 29. 22:33
2021.06.29
Question
Answer code
let fs = require('fs'); let input = fs.readFileSync('/dev/stdin').toString().split(' ').map(el => +el); let climb = input[0]; let slipped = input[1]; let height = input[2]; let day = Math.ceil(( height - slipped) / ( climb - slipped)); console.log(day)
How to solve?
이번에는 논리를 처음부터 잘 짜기로 했다.
그리고 변수명에도 나름 신경을 썼다.ㅎㅎ
게다가, 이번문제는 시간제한이 매우 짧기 때문에 구구절절 적기 보다는 간결하게 코드를 짜줘야 한다.
올라갔다가 미끄러지는 이동거리가 얼마나 되는지 구하면 될거라고 생각해서
(climb - slipped) x days = height
라고 식을 세웠지만, 이렇게 넣으면 오답이다.
하지만 그래도 오답이다.
왜냐하면! 만약 아침에 정상까지 다 오르게 되면 미끄러지지 않기 때문이다.
만약 미끄러졌다가 다시 올라갔을 때, 정상높이에 도달하면 상관없지만,
그 다음날 정상높이에 충분히 도달할 높이가 남았다면 다음날은 미끄러짐이 일어나지 않는다.
(climb - slipped) x days + slipped* = height
* 해당 식의 논리가 올라가면 무조건 미끄러진다는 것인데 아침에 정상까지 오르면 미끄러지지 않으니 미끄러지지 않는 만큼을 다시 더해주는 것이다.
위 식을 변형시켜서 day를 왼쪽으로 두면 (climb - slipped) / (height - slipped) 가 되는데 문제는 담날 올라갈 수 있는 높이가 잔여높이보다 크다면 해당 값에서 소수점 이하의 값이 발생한다는 거다.
즉, 소수점의 의미는 다음날에 무조건 정상에 오른다는 의미이기 때문에 해당 소수점을 올림(ceil)을 시켜서 답을 구했다.
다른분들 코드를 보니까 해당 조건을 나머지가 0이 아니면 day를 하루 더 더하도록 식을 짰다.
if(( height - slipped) % ( climb - slipped) != 0 ) day++
흠, 뭔가 해당코드가 더 가독성과 이해하기 좋은 것 같기도 한 느낌이 든다.
Another version
논리연습할 겸 길게 짜봤다.
처음 변수 초기값을 어떻게 세팅할까에 대해 고민을 많이 했다.
처음에는 move와 day를 모두 0으로 줬는데 그렇게 하다보니 달팽이가 첫째날에 나무를 오르지 않은 것으로 되버렸다.
왜냐면, 첫째날에 나무를 오르고, 만약 목표높이까지 도달하지 못할 경우 미끄러지면서 다음날 올랐을 높이가 move에 카운팅 되면서 day가 둘째날로 바뀌기 때문이다.
그렇기 때문에 첫째날 올랐을 높이와 첫째날이라는 변수를 미리 넣어줘야 한다.
그리고 모든 경우의 수를 다 고려해야한다.
1. 백준에서 제시하는 값을 다 넣어본다.
2. 조건이 (1 ≤ B < A ≤ V ≤ 1,000,000,000) 이와 같기 때문에
slipped < climb < height 이고
climb <= height 이다.
//let fs = require('fs'); //let input = fs.readFileSync('/dev/stdin').toString().split(' ').map(el => +el); let climb = input[0]; let slipped = input[1]; let height = input[2]; let move = 0; let day = 0; while ( true ) { day ++ //첫째날 move += climb //올라감 if ( move < height ) { move -= slipped //목표까지 못갔으면 움직인것에서 빼줌 } else if ( move >= height ) { //만약 목표까지 갔으면 break break; } } console.log(day)
Reference
이 분 블로그에 위 논리에 대해 잘 설명되어있으니 논리가 헷갈리는 분은 위 블로그 ㄱㄱ
'To infinity > Coding Practice' 카테고리의 다른 글
[백준 Node.js/Javascript] 2839번 설탕 배달 (0) 2021.07.03 [백준 Node.js/Javascript] 2775번 부녀회장이 될테야! (0) 2021.07.02 [백준 Node.js/Javascript] 1193번 분수찾기 (0) 2021.06.29 [백준 Node.js/Javascript] 2292번 벌집 (0) 2021.06.28 [백준 Node.js/Javascript] 1152번 단어의 개수 (0) 2021.06.27