문제
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의 사이클 길이를 출력한다.
예제입력 |
예제출력 |
26 | 4 |
55 | 3 |
1 | 60 |
0 | 1 |
문제풀이
해당 문제는 두가지 방법으로 풀어보았는데 결과는 다음과 같다.
1. int를 받아 String으로 변환해서 split을 이용해 자리수를 구해 결과를 나타내는 방법이었다.
결론적으로 답은 맞았으나, 문제점은 해당 방법은 String의 split으로 배열로 나누는 행위 또는 Integer.parseInt로 다시 정수가 되는 행위를 함으로써 메모리 초과가 발생되었다.
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String tmp = str;
int cycle = 0;
do{
String[] split = str.split("");
int len = str.length();
if( len < 2 ) {
// 1자리수면 0 + x = x 이기 때문에
// String (x + x)
str = split[0] + split[0];
} else {
// 2자리수면
// x + y = str(result)
int x = Integer.parseInt(split[0]);
int y = Integer.parseInt(split[1]);
String result = String.valueOf(x + y);
String[] resultSplit = result.split("");
if(resultSplit.length < 2 ){
// 1자리수면 y와 결과값을 문자열로 만든다
str = y + result;
} else {
// 2자리수면 y와 결과값[1]번째 값을 문자열로 만든다
str = y + resultSplit[1];
}
}
// cycle 더해준다
cycle++;
// tmp에 저장한 str과 비교했을때 같을 경우 while 종료
}while(!tmp.equals(str));
System.out.println(cycle);
}
}
2. 좀 더 효율성을 높이고자 int의 나눗셈과 나머지 개념을 활용하였고
숫자를 이어붙이는 용도로는 메모리 활용을 위해 StringBuilder를 사용했다.
문자열을 이어붙이거나 삭제할 경우 StringBuilder가 메모리 측면에서 매우 효율적이다는 것을 깨닫게 된다.
아래는 StringBuilder 사용법이다.
https://d-life93.tistory.com/372?category=969017
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int temp = N;
int cycle = 0;
StringBuilder stringBuilder = new StringBuilder();
do{
stringBuilder.delete(0,2);
if(N < 10){
stringBuilder.append(N);
stringBuilder.append(N);
} else {
int ten = N / 10;
int one = N % 10;
int result = ten + one;
stringBuilder.append(one);
stringBuilder.append(result % 10);
}
N = Integer.parseInt(stringBuilder.toString());
cycle++;
}while( !(temp == N) );
System.out.println(cycle);
}
}
'Etc > problem solving' 카테고리의 다른 글
백준 2562, 최댓값 (0) | 2021.10.09 |
---|---|
백준 10818, 최소, 최대 (0) | 2021.10.08 |
백준 10951, A+B - 4 (0) | 2021.10.06 |
백준 10952, A+B - 5 (0) | 2021.10.06 |
백준 10871, X보다 작은 수 (0) | 2021.10.06 |