알고리즘 풀이/백준(BOJ)

[JAVA/백준1110] 더하기 사이클

닥스훈스 2019. 6. 11. 17:20

1. 문제

 

2. 풀이

사이클의 횟수를 구하는 getCycle()을 호출하는데 여기서 원래 수로 돌아올 때 까지 연산이 반복되므로 각각의 조건에 나누어 재귀로 함수를 호출하고 사이클의 횟수를 저장하는 변수count의 값을 하나씩 증가해주었다.
연산은 정수n이 주어졌을때 10의 자리수와 1의 자리수를 더해준 후, 원래 n의 오른쪽 자리 수와 이어붙어주어야 하므로 string클래스의 내장 함수를 사용하는것이 편할것 같다는 생각이 들어서 문자열로 입력받았다.

n이 00일 경우 ~ 1번만 연산을 해주면 되므로 바로 리턴
n이 0~9일 경우 ~ 예를 들어 n=9일 때, 09→0+9=09이므로 이어 붙이면 다음 n은 99가 된다. 즉, n을 두번 이어 붙이면 된다.
n이 두자리 수인 경우 ~ 변수tmp에 n의 각 자릿수의 합을 저장하고, n의 오른쪽 자리 수와 tmp를 이어 붙인다. 이 때,  Integer.toString(tmp)만 적을 경우 n<10일 때, 에러가 발생하는데 연산 횟수가 너무 커서 에러가 발생하는것 같았다. tmp%10을 넣으니 잘 동작하였다.

 

3. 소스코드

import java.util.*;

public class Main2 {
	public static int count = 0; // 호출 횟수
	public static String nSave;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String n = sc.nextLine();
		if (n.length() == 1) {
			n = '0' + n;
		}
		nSave = n;
		System.out.println(getCycle(n));
	}

	private static int getCycle(String n) {
		if (n.equals("00")) {
			count++;
		} else if (count != 0 && n.equals(nSave)) {
			return count;
		} else if (Integer.parseInt(n) < 10) { // 한자리수 또는 0으로 시작하면
			count++;
			int s = Integer.parseInt(n);
			String ss = Integer.toString(s) + Integer.toString(s);
			getCycle(ss);
		} else { // 두자리 수이면
			count++;
			int tmp = (n.charAt(0) - '0') + (n.charAt(1) - '0');
			n = n.charAt(1) + Integer.toString(tmp % 10);
			getCycle(n);
		}
		return count;
	}
}

'알고리즘 풀이 > 백준(BOJ)' 카테고리의 다른 글

[JAVA/백준2606] 바이러스  (0) 2019.06.13
[JAVA/백준15685] 드래곤 커브  (0) 2019.06.12
[JAVA/백준9012] 괄호 - 스택  (0) 2019.06.08
[JAVA/백준1003] 피보나치 함수 DP  (0) 2019.06.04
[JAVA/백준10828] 스택  (0) 2019.06.02