Inor

[백준] 9324번 진짜 메시지 본문

Algorithm/백준

[백준] 9324번 진짜 메시지

Inor 2017. 12. 20. 21:05

- 문제 : https://www.acmicpc.net/problem/9324


 비밀 코드가 정확한 코드인지 잘못된 코드인지 해석하는 문제입니다. 어떤 알파벳이 이전에 3번 출현 했으면 해당 알파벳을 한번 더 써줘서 비밀 코드를 만듭니다. 예를 들어서, ABBSABB라는 코드가 있다면 B가 3번 출현했고 마지막에 B를 추가로 적어서 비밀 코드를 만들었습니다. 그리고 이 코드는 참입니다. 만약, ABBSAB 코드가 주어졌다면 이는 거짓입니다. B가 3번 나왔지만 마지막에 B를 써주지 않았습니다. 또한, ABBSABA 코드가 주어졌다면 이는 거짓 코드입니다. B가 3번 출현했지만 마지막 B 다음에 A가 출현했습니다.




- 풀이


 이전까지 알파벳이 얼마나 출현했는지 보여주는 배열(numOfAfter)을 선언해서 암호 코드를 해석하는 기준으로 삼았습니다. numOfAftre의 한 인자가 3이라면, 그 다음 값과 비교했습니다. 알파벳이 3번째 출현했지만 그 값이 배열의 마지막 값이라면 잘못된 코드이기 때문에 반복문을 그만두고 잘못된 코드임을 return 합니다. 알파벳이 3번 출현했고 다음 알파벳이 현재 알파벳과 같다면 아직 맞는 코드이기 때문에 반복문으로 복귀합니다. 만약 3번째 출현했지만 현재 알파벳과 다음 알파벳이 다르다면 잘못된 코드이기 때문에 반복문을 그만두고 잘못된 코드임을 return 합니다.




- 코드


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

public class RealMessage {
	int numOfMeesage;
	String[] messages;
	int[] numOfAfter;

	public void setValues() throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		numOfMeesage = Integer.parseInt(br.readLine());
		messages = new String[numOfMeesage];
		numOfAfter = new int[26];

		for (int i = 0; i < messages.length; i++) {
			messages[i] = br.readLine();
		}
	}

	public boolean checkMessage(String message) {
		boolean isTrueMessage = false;
		char[] alpabets = message.toCharArray();
		int index;

		// A == 65
		for (int i = 0; i < alpabets.length; i++) {
			index = alpabets[i] - 65;
			numOfAfter[index]++;

			if (numOfAfter[index] == 3) {
				if (i + 1 >= alpabets.length) {
					return false;
				}

				if (alpabets[i + 1] == alpabets[i]) {
					numOfAfter[index] = 0;
					i++;
				} else {
					return false;
				}
			}
		}
		isTrueMessage = true;
		return isTrueMessage;
	}

	public void solve() throws NumberFormatException, IOException {
		setValues();		
		
		for (int i = 0; i < messages.length; i++) {
			if (checkMessage(messages[i])) {
				System.out.println("OK");
			} else {
				System.out.println("FAKE");
			}
			Arrays.fill(numOfAfter, 0);
		}
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		RealMessage m = new RealMessage();
		m.solve();
	}

}

'Algorithm > 백준' 카테고리의 다른 글

[백준] 14890번 경사로  (0) 2018.01.03
[백준] 14889번 스타트와 링크  (0) 2017.12.28
[백준] 2851번 슈퍼 마리오  (0) 2017.12.18
[백준] 10250번 ACM 호텔  (0) 2017.12.10
[백준] 11015번 붕어빵 판매하기  (0) 2017.11.27
Comments