풀이
`Scanner` 사용과 `while 문`, `if 문` 등등
다양한 문법을 알고 있어야 풀 수 있는 문제였다.
오답
이 코드를 작동시킬 때마다 내 노트북의 수명이 적어도 10초는 단축되었을 것 같다.
N의 값이 계속 변해서 계산이 영원히 반복된다. 노트북에게 츠쿠요미를 시전해버린 것이다.
코드를 실행하고 아무리 기다려도 결과가 나오지 않았다.
오지 않는 결과를 기다리며 비교 값을 고정시켜야겠다는 생각을 하게 되었다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int count = 0;
sc.close();
while(true) {
int result = (N%10*10)+((N/10+N%10)%10);
if(result == N) {
break;
}
count ++;
N = result; // 문제 발견!
}
System.out.print(count);
}
}
정답
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int start = N;
sc.close();
int count = 0;
while(true) {
N = (N%10*10)+((N/10+N%10)%10);
count ++;
if(start == N) {
break;
}
}
System.out.print(count);
}
}
처음 봤을 때 문제가 요구하는 게 도대체 뭔지 이해가 안 가서 종이에 써봤다.
쓰고 나니 이해가 훨씬 잘 됐다.
자릿수 추출법을 알면 계산식을 만들어 낼 수 있다.
`% ` 와 `/` 를 잘 활용하면 된다.
26에서 십의 자릿수를 구하고 싶으면 10으로 나누면 되고,
일의 자릿수를 구하고 싶으면 10으로 나눈 나머지를 구하면 된다.
글로 써놓으니 와닿지 않는데, 직접 계산해보면 바로 이해가 될 것이다.
그래서 만들어낸 식이 `(N%10*10)+((N/10+N%10)%10)` 이다.
(혹시 머리가 좋은 사람은 이 식을 한 번에 만들어 낼 수 있는 걸까? 나는 여러 번의 시행착오 끝에 만들어냈다.)
이 식을 `While` 문에 넣어두고 조건을 `true`로 걸어두면 계속해서 식이 반복된다.
언제까지? 목표를 달성할 때까지!
우리의 목표는 처음 입력한 `N` 이 주어진 계산식을 몇 번 반복하면 처음 입력된 수로 돌아오는지 구하는 것이다.
그래서 변수 `count` 를 선언해 준 뒤 `count++` 를 사용해 계산식이 실행될 때마다 `count` 값을 1씩 올리는 것으로 식이 몇 번 반복되었는지 계산할 수 있는 것이다.
처음 입력한 값을 변수 `start` 에 저장해두면 `N` 값을 처음에 저장해둔 `start` 와 비교할 수 있게 된다.
언제까지 식을 반복해야 하는지 컴퓨터에게 알려줄 수 있는 것이다.
그렇게 영원히 반복될지도 몰랐던 `while`문의 고통 속에서 컴퓨터를 구해줄 수 있다!
`if(start == N)` 의 조건이 성립되면 `if`문 안에 잠자고 있던 `break`가 발동되어 `while`문을 부수고 나오게 된다.
그리고 최종적으로 `count` 를 출력해주면 문제가 마무리된다.
느낀점
부끄럽지만 나의 백준 티어는 현재 브론즈 2다.
이 문제의 레벨이 브론즈 1이니까, 나는 내 티어보다 높은 문제를 풀어낸 것이다.
자랑스럽다!
롤을 할 때 브론즈 분들을 상당히 무시하고는 했었는데 내 백준 티어가 브론즈라니···.
문득 '나는 누군가에게 무시당할 수 있는 실력을 가지고 있구나.'라는 생각이 들었다.
게임을 할 때도 높은 티어를 찍으려면 많은 노력과 시간을 투입해야 한다는 것을 알고 있다.
그것은 당연한 것이다.
그러니 너무 조급해할 필요는 없을 것 같다.
뭐든 꾸준하고 성실하게 반복하면 결국 성장할 수 있다는 것을 나는 알고 있으니까.
'JAVA > 백준(BAEK JOON)' 카테고리의 다른 글
[백준] 1546번 평균 자바(JAVA) (0) | 2022.06.10 |
---|---|
[백준] 1330번 두 수 비교하기 자바(JAVA) (0) | 2022.06.09 |
[백준] 1008번 A/B 자바(JAVA) (0) | 2022.05.30 |
[백준] 1001번 A-B 자바(JAVA) (0) | 2022.05.28 |
[백준] 1000번 A+B 자바(JAVA) (0) | 2022.05.27 |