반응형

백준 1110번 문제


풀이

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이니까, 나는 내 티어보다 높은 문제를 풀어낸 것이다.

자랑스럽다!

 

롤을 할 때 브론즈 분들을 상당히 무시하고는 했었는데 내 백준 티어가 브론즈라니···.

문득 '나는 누군가에게 무시당할 수 있는  실력을 가지고 있구나.'라는 생각이 들었다.

 

게임을 할 때도 높은 티어를 찍으려면 많은 노력과 시간을 투입해야 한다는 것을 알고 있다.

그것은 당연한 것이다.

그러니 너무 조급해할 필요는 없을 것 같다.

뭐든 꾸준하고 성실하게 반복하면 결국 성장할 수 있다는 것을 나는 알고 있으니까.

반응형
그레이트현