본문 바로가기

ProgramSoliving

백준 : 10266

반응형

https://www.acmicpc.net/problem/10266

 

10266번: 시계 사진들

문제 상근이는 보통의 시계와는 다른 독특한 시계 사진 두장이 있습니다. 시계는 n개의 동일한 길이와 목적을 가진 시계 바늘들을 가지고 있습니다. 애석하게도 시계의 숫자들은 희미해져 각 시

www.acmicpc.net

 

문제의 input으로는 어느 바늘을 기준으로 시계바늘이 있는 위치를 간격 0 ~ 360000 으로 보여준다.

 

이것은 0과 1을 가지는 문자열로 나타낸다면 문자열 길이 360,000인 00011001011110 비트형태의 문자열을 만들수가있다.

 

이상태에서 기존 비교해야할 문자열을 길이를 두배로하고 KMP알고리즘을 이용해서 origin 에 pattern이 존재여부를 확인하면 같은 시간을 가리키는가? 를 확인 할 수 있다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B10266 {
	static int N;
	static int[] strIndex = new int[360000];
	static int[] patternIndex = new int[360000];

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		N = Integer.parseInt(br.readLine());

		// strIndex Input
		st = new StringTokenizer(br.readLine());
		while (st.hasMoreTokens()) {
			strIndex[Integer.parseInt(st.nextToken())] = 1;
		}

		st = new StringTokenizer(br.readLine());
		while (st.hasMoreTokens()) {
			patternIndex[Integer.parseInt(st.nextToken())] = 1;
		}

		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < 360000; i++)
			sb.append(strIndex[i]);

		String str = sb.append(sb).toString();
		sb = new StringBuilder();
		for (int i = 0; i < 360000; i++)
			sb.append(patternIndex[i]);

		String pattern = sb.toString();

		if (KMP(str, pattern) == 1)
			System.out.println("possible");
		else
			System.out.println("impossible");

	}

	static int[] getPi(String Pattern) {
		int[] pi = new int[Pattern.length()];

		int j = 0;

		for (int i = 1; i < Pattern.length(); i++) {

			while (j > 0 && Pattern.charAt(i) != Pattern.charAt(j)) {
				j = pi[j - 1];
			}
			if (Pattern.charAt(i) == Pattern.charAt(j)) {
				pi[i] = ++j;
			}
		}
		return pi;
	}

	static int KMP(String Origin, String Pattern) {

		int j = 0;
		int[] pi = getPi(Pattern);
		for (int i = 0; i < Origin.length(); i++) {

			while (j > 0 && Origin.charAt(i) != Pattern.charAt(j)) {
				j = pi[j - 1];
			}

			if (Origin.charAt(i) == Pattern.charAt(j)) {
				if (j == Pattern.length() - 1) {
					return 1;
				} else {
					++j;
				}
			}

		}

		return 0;
	}
}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 5670  (0) 2020.07.18
백준 : 14725 (트라이)  (0) 2020.07.18
백준 : 6543  (0) 2020.07.15
백준 : 6497  (0) 2020.07.14
백준 : 11585 속터지는 저녁 메뉴  (0) 2020.07.13