It's easy, if you try

[백준/boj] 2331: 반복수열 (Java) / 구현 본문

알고리즘/자바(Java)

[백준/boj] 2331: 반복수열 (Java) / 구현

s5he2 2021. 2. 23. 23:11
반응형

문제

 

2331번: 반복수열

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.

www.acmicpc.net

풀이

 

import java.io.*;
import java.util.*;

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int A;
	static int P;
	static List<Integer> D = new ArrayList();

	public static void main(String[] args) throws Exception {
		st = new StringTokenizer(br.readLine());
		A = Integer.parseInt(st.nextToken());
		P = Integer.parseInt(st.nextToken());
		D.add(A);
		makeD(A, P);
		System.out.println(D2.size()-1);
	}

	private static void makeD(int a, int p) {
		while (true) {
			int total = 0;
			while (a > 0) {
				total += Math.pow(a % 10, p);
				a /= 10;
			}

			if (D.contains(total)) {
				for (int i = D.size() - 1; i >= 0; i--) {
					if (D.get(i) == total) {
						break;
					}
					D.remove(i);
				}
				break;
			}
			D.add(total);
			a = total;
		}
	}
}

 

  • 숫자 각 자리의 P 제곱의 덧셈을 알고 싶다면 아래의 코드를 쓰면 된다. 

 

 

 

	int total = 0;
	while (a > 0) {
		total += Math.pow(a % 10, p);
		a /= 10;
    }​

위의 과정을 a = 327 , p= 2로 설명해보자면

1. Math.pow( 327 % 10 = 7 (일의자리) , 2) = 49

2. a < == 327 /10 = 32 (일의 자리 제거) 

3. Math.pow( 32 % 10 = 2 (십의 자리), 2) = 4

4. a <== 32 / 10 = 3 (십의 자리 제거)

5. Math.pow(3 % 10 = 3(백의 자리), 2) = 9

6. a <== 3/ 10 = 0 (백의 자리 제거, while문 조건(a > 0) 부합 ==> while문 종료)

total 은 49 + 4+ 9 = 62 가 된다.

 

  • D[0] 은 A 로 초기화 하고, total 이 구해질때 마다 D에 해당 값이 반복되는지 확인한다. (contains 로 확인) 
    • 반복 된다면 해당 값 인덱스가 될때까지 탐색하며 뒤에서부터 remove 한다. 해당 값 인덱스를 만나면 종료하고, D 배열의 size -1 (해당 값을 포함하면 안되기 때문) 을 반환한다.
    • 반복 되지 않는다면 D에 추가한다.
반응형
Comments