이번문제는 딱히 알고리즘이라고 적용할건 없었고 문제가 요구한 요구사항대로 구현을 했다.
문제를 살펴보자.
문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
출력
첫째 줄에 N의 사이클 길이를 출력한다.
문제 접근 방법
이번 문제는 일단 어떤 변수를 만들고 그리고 반복문을 어떻게 설정하느냐가 관건인 문제이다.
나는 이번 문제에서 3개의 변수를 만들었다.
1. 초기 입력 변수 및 바뀌는 수가 저장되는 변수
2. 입력받은 변수를 저장하는 변수
3. 초기 입력변수와 같은지 확인하는 변수
그래서 내가 위에서 만든 변수로 만든 반복문은 아래와 같다.
String su = sc.next();
String flag = "";
String first = su;
int count = 0;
while(!flag.equals(first)) { //flag가 first랑 같아질때까지 반복
}
위 반복문은 처음에 입력받은 수와 계속해서 바뀌는 수 flag가 같아질때까지 반복을 하게 된다.
그럼 해당 while문 안에 우리가 해줘야 할것은이제
연산 처리를 해주면 된다.
while문 안에 내가 해준 연산처리는
1. 수가 10보다 작으면 앞에 "0"을 붙여준다.
2. 각 자리수의 합을 구한다.
3. 세로운수기 10보다 작으면 앞에 "0"을 붙여주고
기존숫자 맨오른쪽수 + 자리수 합에서 맨오른쪽수 => 새로운수를 만들고
기존수를 새로운수로 바꿔준다.
4. 새로운 수가 10보다 크면
기존숫자 맨오른쪽수 + 자리수 합에서 맨오른쪽수 => 새로운수를 만들고
기존수를 새로운수로 바꿔준다.
위 내용을 소스로 보면 아래와 같다.
while(!flag.equals(first)) { //check가 su랑 같아질때까지 반복
count++; //count+1
//입력받은수가 10보다 작으면
if(Integer.parseInt(su)<10)
su = "0"+su;
String[] one = su.split("");
int sum = 0;
for(int i = 0; i<one.length;i++) { //split한 배열에 접근
sum+=Integer.parseInt(one[i]);
}
if(sum<10) {
String temp = "0"+Integer.toString(sum);
String[] arr = temp.split("");
String result = one[1] +arr[1];
int num = Integer.parseInt(result);
flag = Integer.toString(num);
su = flag;
}else {
String[] arr = Integer.toString(sum).split("");
String result = one[1] +arr[1];
int num = Integer.parseInt(result);
flag = Integer.toString(num);
su = flag;
}
}
이렇게되면 사이클이 몇번도는지 구할수 있다.
이번 문제를 풀다가 다른 답안이 있나 확인해보니 훨씬 간결하고 가독성이 좋은 코드를 발견하게 되었다.
물론 코드에는 정답이 없다고는 하지만 아무래도 이번 소스가 정답이 아닐까 싶다.
이번 소스의 접근 방법은 아래와 같다.
1의 자리와 10의 자리를 10으로 나눈 몫과 나머지를 통해서 값을구했다.
소스는 아래와 같다.
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
// TODO Auto-generated method stub
Run a = new Run();
Scanner sc = new Scanner(System.in);
int su = sc.nextInt();
int first = su;
int check = Integer.MIN_VALUE;
int count = 0;
while(first != check) {
count++;
int ten = su/10; //10의 자리수를 구함
int one = su%10; //1의 자리수를 구함
int sum = ten+one; // 10의 자리수와 1의 자리수를 더함
int sumOne = sum%10; // 더한것의 1의 자리수를 구함
check = (one*10)+sumOne; //1의 자리수 * 10 해서 10의자리수 만들고 더한것의 1의 자리수를 만들어 값을 구함
su = check;
}
System.out.println(count);
}
}
느낀점
1. 숫자의 자리수를 가지고 답을 구하는 문제라면 해당 /자리수 %자리수 를 통해서 값을 구하자.
'코딩일기 > 알고리즘' 카테고리의 다른 글
[백준 10162번 :브론즈4] 전자레인지 (그리디/Java) (0) | 2021.07.29 |
---|---|
[백준 10870번 : 브론즈2] 피보나치수 5 (DP/ Java) (0) | 2021.07.29 |
[백준 1012번 : 실버2] 배추 (DFS / Java) (0) | 2021.07.29 |
[백준 2217 : 실버4] 로프 (그리디/Java) (0) | 2021.07.29 |
[백준 1149번 : 실버1] RGB거리 (DP/Java) (0) | 2021.07.28 |