일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- setDate
- useRef()
- sort()
- 항해99솔직후기 #항해99장점 #항해99단점 #부트캠프추천
- Math.sqrt()
- 교집합
- React
- substring()
- repeat()
- slice()
- map()
- includes()
- Number()
- filter()
- toUpperCase()
- 소수점 올림내림
- isNaN()
- parseInt()
- Math.floor()
- charAt()
- new Date()
- indexOf()
- 3진수
- Eventlitener
- 차집합
- jsx반복문
- getday()
- useEffect()
- reat if문
- useState()
- Today
- Total
개발자로 전향중
[백준] 더하기 싸이클 본문
규칙을 살펴보기 전, 숫자를 10으로 나누면 몫은 앞자리가, 나머지는 뒷자리가 되는 것을 한 번 더 떠올리고 들어가면 좋다!
26 / 10 = 몫: 2 / 나머지: 6
문제의 예시를 한 번 더 살펴보면,
26 → 2 + 6 = 8 → 68
입력값이 26인 경우, 2+6 = 8. 다음 수는 6이 10의 자리가 되고 8이 1의 자리가 되어서 68이 된다.
같은 과정을 반복하면 6+8 = 14. 다음 수는 8이 10의 자리가 되고 14의 오른쪽 수인 4가 1의 자리가 되어서 84가 된다.
여기서 입력값의 1의 자리는 다음 수의 10의 자리가 된다는 것, 각 자릿수의 합의 오른쪽 숫자가 1의 자리가 된다는 것이 포인트.
그럼 우리에게 필요한 과정은
1️⃣ 입력값의 10의 자리와 1의 자리를 뽑고,
2️⃣ 그걸 더한 값의 1의 자리수를 뽑고,
3️⃣ 다음 수로 넘겨줄 1️⃣의 1의 자리와 2️⃣를 합친 값을 구한다.
먼저, 1️⃣
입력값의 10의 자리를 구하는 방법은 Math.floor(num / 10).
주어진 숫자와 같거나 작은 '정수' 중에서 가장 큰 수를 구하는 Math.floor함수를 이용하면 된다.
26의 경우, num = 26이므로 Math.floor(2.6)이 되어서 2가 도출된다.
입력값의 1의 자리를 구하는 방법은 num % 10
위에서 1의 자리는 10으로 나누었을 때 나머지라고 했었으니, 나머지의 값을 구하는 %를 사용하면 된다.
26의 경우, 26 % 10 = 6이 도출된다.
2️⃣
이제 이 두 값을 더하고, 그 값의 오른쪽 자릿수를 도출해내는 방법은? 위에서 했던 것과 똑같다!
먼저 두 값을 더하고 (Math.floor(num / 10) + num % 10),
오른쪽 자릿수, 즉 1의 자리를 구하는 방법! %10을 사용해주자!
그럼 68의 경우처럼 자릿수의 합이 10의 자리를 넘어가게 되더라도 오른쪽 자릿수, 1의 자리를 도출해낼 수 있다.
26 → 2 + 6 = 8 → 68
3️⃣
지금까지 26에서의 각 자릿수 2와 6을 뽑아내고, 자릿수들의 합의 1의 자리인 8을 구하는 것까지는 완료했다.
도출된 8은 다음 수의 1의 자리에 고대로 이용될 것이다.
그럼 다음 수의 10의 자리를 구하는 방법은? 즉, 6과 8을 합친 68에서 6을 구하는 방법은?
68의 6의 출처는 26의 1의 자리라는 것을 까먹지 말자!
그러므로 입력값 % 10으로 1의 자리를 먼저 도출한 후, 거기다 * 10을 해주면 1의 자리를 10의 자리로 만들 수 있다.
60 + 8 = 68 완성!
이렇게 규칙을 다 찾아두었으니, 다음 수가 입력값과 동일 할 때까지 횟수를 카운트해주는 반복문을 만들면 끝!
💡 답안 코드
let input = Number(require('fs').readFileSync('/dev/stdin').toString());
let num = input;
let sum;
let i = 0;
while (true) {
i++;
sum = Math.floor(num / 10) + num % 10;
num = (num % 10) * 10 + sum % 10;
if (input === num) {
break;
}
}
console.log(i);
while문을 통해 입력값의 각 자릿수의 합을 구하고 그걸 활용한 다음 수를 구하는 과정을 계속 반복하다가,
다음 수가 입력값과 동일해지면 break로 while문을 종료시키면 된다!
👀 Review
10으로 나눈 것의 몫과 나머지가 어떤 역할을 하는지 다시 한 번 리마인드!
📍출처
'자료구조&알고리즘' 카테고리의 다른 글
[백준] 10773번 제로 (0) | 2022.03.07 |
---|---|
[백준] 터렛 (0) | 2022.03.05 |
[백준] 소수구하기 (0) | 2022.03.04 |
[백준] ACM 호텔 (0) | 2022.03.03 |
[백준] 베르트랑 공준 (0) | 2022.03.02 |