import java.util.Scanner;
public class Main1110 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int copy = N;
int count = 0;
while(true){
N = ((N%10)*10) + (((N/10)+(N%10))%10);
count++;
if(copy == N){
break;
}
}
System.out.println(count);
}
}
이 문제는 정수 N을 입력받는다.
만약 N이 26이 입력되었다면
2+6=8 이렇게 한싸이클이다.
6+8 = 14 두번째 사이클
8+4 = 12 세번째 사이클
4+2 = 6 네번째 사이클
26<- 즉 이렇게 다시 돌와오면 사이클이 종료된다.
사이클의 횟수를 출력하는 예제이다.
이 문제의 알고리즘을 파악해보면 ,
26이 입력되었을 시, 입력값의 일의자리수를 다음번의 십의 자리수로 만들어주면 되고,
더한값 8을 다음번의 일의 자리수로 만들어 주면된다.
1. 새로운 십의자리수 만들기
N%10 계산을 하면 일의 자리수가 반환된다. 즉 26을 10으로 나머지 연산을 진행해 6을 얻는 것이다.
후에 10을 다시 곱해주면 60을 얻으므로 새로운 십의자리수로 만들어 줄 수 있다.
즉 int T = ((N%10)*10) <- 십의 자리수
2. 새로운 일의 자리수 만들기
N을 26이라 하였을 때 , N/10 은 십의자리수 2를 얻게 된다. N%10은 일의자리수 6을 얻게된다.
십의자리수와 일의자리수를 더하면 2+6처럼 분해를 하여 계산을 할 수 있다. 결과는 8이 나온다.
여기에서는 결과가 8이라 바로 일의자리수에 넣어도 무방하지만, 만역 결과가 10이상이라면 %10연산을 따로 해줘야 한다. 그래야 일의자리수를 반환이 가능하다. 결국 8%10이므로 8이반환된다.
int T = (((N/10)+(N%10))%10); <- 일의자리수
3. 서로 합치기
십의자리수와 일의자리수를 합친다. 위에서 60과 8을 얻었다. 즉 더하면 68이 반환된다.
반복문안에 결과가 있으므로 26이 돌아올때 까지만 while문을 반복하면 된다.
즉 N값을 따로 copy를 해주어 보관을 하고 if문으로 종료 조건을 걸면 된다.
그리고 count값을 세기위해 증감연산자를 반복문 안에 삽입한다.
또한 반복적으로 N값을 갱신을 해주어야 하므로 위에서 선언한 int T 대신 N값에 값을 대입한다.
N = ((N%10)*10) + (((N/10)+(N%10))%10);
마지막에 count값을 출력해주면 된다.
'휴지통 > 알고리즘 & 자료구조' 카테고리의 다른 글
병합 정렬(MergeSort) (0) | 2021.07.06 |
---|---|
동적계획법/분할정복 (0) | 2021.07.05 |
백준 10952 (0) | 2021.07.03 |
백준 10951 (0) | 2021.07.03 |
재귀 호출(Recursive Call) (0) | 2021.07.03 |