1. 문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
2.
<코드 -1>
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n,num;
int cnt=0;
n=sc.nextInt();
num=n;
while(true){
num=num%10*10+(num/10+num%10)%10;
cnt++;
if(n==num) break;
}
System.out.println(cnt);
sc.close();
}
}
코드 1 풀이
문제에서처럼 n=26을 예로 들어 설명해 보자면
cnt=0 (cnt: 사이클의 길이)
n=26
num=26
<반복문>
2+6=8 ( 2는 num/10 , 6은 num%10 이고, 8은 둘의 합이므로 num/10+num%10)이다.
num=68 (10의 자리수이므로 6에 10을 곱해준다. 따라서 num%10*10이고, 8의 경우는 위에서 구한 합의 일의자리이므로 (num/10+num%10)%10이다. )
cnt++ (cnt는 1)
num이 n과 같아질때까지 반복한다.
<코드 -2>
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n,a,b,sum,num;
int cnt=0;
n=sc.nextInt();
num=n;
while(true){
a=num/10; b=num%10;
sum=a+b;
cnt++;
num=b*10+sum%10;
if(n==num) break;
}
System.out.println(cnt);
sc.close();
}
}
코드 2 풀이
코드 2는 코드1풀이에서 설명한 보라색 부분을 각각 변수에 넣었다. 즉, num의 십의 자리수를 a, num의 일의 자리수를 b, 그 둘의 합을 sum에 대입했다.
3.
이 문제에 관해 표를 그리니 문제 이해도 빨라지고 코드를 어떻게 짜야하는 지 구성하기 편리했다.
다음에도 숫자가 헷갈리거나 변수가 많아지는 문제가 나오면 표를 그려서 해결하도록 해야겠다.
4. 링크
https://www.acmicpc.net/problem/1110
'Computer Science > 자료구조와 알고리즘' 카테고리의 다른 글
[JAVA] 백준 5543번 : 상근날드 (1) | 2020.07.23 |
---|---|
[JAVA] 백준 10039번 : 평균점수 (0) | 2020.07.19 |
[JAVA] 10951번 : A+B -4 (0) | 2020.07.18 |
[JAVA] 백준 10952번 : A+B -5 (0) | 2020.07.18 |
[JAVA] 백준 10871번 : X보다 작은수 (0) | 2020.07.17 |