λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[λ°±μ€€] 9324번: μ§„μ§œ λ©”μ‹œμ§€(κ΅¬ν˜„)

by 주발2 2020. 4. 9.
λ°˜μ‘ν˜•

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

 

9324번: μ§„μ§œ λ©”μ‹œμ§€

문제 μŠ€νŒŒμ΄λ“€μ€ 사령뢀와 ν†΅μ‹ ν•˜κΈ° μœ„ν•΄μ„œ SMTP(λΉ„λ°€ λ©”μ‹œμ§€ 전솑 ν”„λ‘œν† μ½œ)λ₯Ό μ‚¬μš©ν•΄ λΉ„λ°€ νšŒμ„ μœΌλ‘œ μ „μž λ©”μ‹œμ§€λ₯Ό 보낸닀. λ©”μ‹œμ§€κ°€ 적듀에 μ˜ν•΄ μ‘°μž‘λ˜μ–΄ λ³΄λ‚΄μ§„ 것이 μ•„λ‹Œ μ§„μ§œ λ©”μ‹œμ§€λΌλŠ” 것을 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ λͺ¨λ“  λ©”μ‹œμ§€λŠ” νšŒμ„ μ— λ…Έμ΄μ¦ˆκ°€ μžˆμ—ˆκ±°λ‚˜ λ°œμ‹  μΈ‘μ—μ„œ 손을 λ–¨λ©΄μ„œ λ©”μ‹œμ§€λ₯Ό 보낸 κ²ƒμ²˜λŸΌ λ³€ν˜•λ˜λŠ”λ°, μ΄ λ³€ν˜• μ•Œκ³ λ¦¬μ¦˜μ€ λ©”μ‹œμ§€λ₯Ό κ°€λ‘œμ±„λŠ” μžλ“€μ΄ μš°μ—°νžˆ λ³€ν˜• κ·œμΉ™μ„ ν‰λ‚΄ λ‚Ό 수 없을 μ •λ„λ‘œ μ •κ΅ν•˜λ‹€. λ˜ν•œ μš”μ›λ“€μ˜ 머리에 총ꡬ가 겨눠져 κ°•μ œλ‘œ λ©”μ‹œμ§€λ₯Ό

www.acmicpc.net

μ½”λ“œ

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int t = scan.nextInt();
		for(int tc=0; tc<t; tc++) {
			String str = scan.next();
			int[] alpa = new int[26];
			boolean flag = true;
			String result = "";
			for(int i=0; i<str.length(); i++) {
				alpa[str.charAt(i) - 'A'] ++;
				
				// λ™μΌν•œ μ•ŒνŒŒλ²³μ΄ 3번 λ“±μž₯ν–ˆμ„ 경우,
				if(alpa[str.charAt(i) - 'A'] == 3) {
					
					// λ§ˆμ§€λ§‰ λ¬Έμžμ— λ„λ‹¬ν–ˆμ„λ•Œ λ™μΌν•œ λ¬Έμžκ°€ 3번이면 λ¬Έμžκ°€ μ‚½μž…μ΄ μ•ˆλœκ²½μš°μ΄λ―€λ‘œ ν‹€λ¦° 문자.
					if(i == str.length()-1) {
						flag = false;
						break;
					}
					
					// 문자λ₯Ό ν•œ 번 μ‚½μž…ν•΄μ•Όν•˜λŠ”λ° μ•žλ’€ λ‹€λ₯΄λ©΄ ν‹€λ¦° 문자.
					if(str.charAt(i) != str.charAt(i+1)) {
						flag = false;
						break;
					}
					
					// μœ„ μΌ€μ΄μŠ€μ— λͺ¨λ‘ ν¬ν•¨μ•ˆλ˜λ©΄ μ„Έ 번 λ“±μž₯ν•œ λ¬Έμžκ°€ μ‚½μž…λœ κ²½μš°λ―€λ‘œ, ν•œμΉΈ κ±΄λ„ˆλ›΄λ‹€.
					i ++;
					
					// ν•΄λ‹Ή 문자 횟수 μ΄ˆκΈ°ν™” μ‹œμΌœμ£ΌκΈ°
					alpa[str.charAt(i) - 'A'] = 0;
				}
			}
			result = (flag) ? "OK" : "FAKE";
			System.out.println(result);
			
		}
		
		scan.close();
	}

}

풀이

각 λ¬Έμžκ°€ μ„Έ 번 λ“±μž₯ν•  λ•Œ ν•œ 번 더 λ¬Έμžκ°€ μ‚½μž…λœλ‹€.

주어진 λ¬Έμžμ—΄μ΄ λλ‚ λ•ŒκΉŒμ§€ μœ„ 쑰건을 λ§Œμ‘±ν•˜λ©΄ μ§„μ§œ λ©”μ‹œμ§€κ³ , λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λ©΄ κ°€μ§œ λ©”μ‹œμ§€λ‹€.

"AABCAABBB"

μœ„μ—μ„œ μƒ‰μΉ ν•œ A, Bκ°™μ€κ²½μš° 이전에 λ¬Έμžκ°€ 3λ²ˆμ™”μœΌλ―€λ‘œ ν•œ 번 더 μ‚½μž…λœ κ²½μš°λ‹€.

 

λ”°λΌμ„œ λ¬Έμžμ—΄μ„ λκΉŒμ§€ νƒμƒ‰ν•˜λ©΄μ„œ μ•„μŠ€ν‚€μ½”λ“œκ°’μ„ κΈ°μ€€μœΌλ‘œ ν•΄λ‹Ή 문자λ₯Ό 인덱슀둜 배열에 값을 μ¦κ°€μ‹œν‚¨λ‹€.

alpa[str.charAt(i) - 'A'] ++;

 

 

1) κ·Έ ν›„ λ¬Έμžμ—΄μ΄ 3λ²ˆμ™”μ„κ²½μš°, 예제 μž…λ ₯ 2λ²ˆμ§Έμ™€ 같이 λ¬Έμžμ—΄μ΄ λ§ˆμ§€λ§‰μΈ κ²½μš°λ„ κ³ λ €ν•΄μ•Όν•œλ‹€.

// λ§ˆμ§€λ§‰ λ¬Έμžμ— λ„λ‹¬ν–ˆμ„λ•Œ λ™μΌν•œ λ¬Έμžκ°€ 3번이면 λ¬Έμžκ°€ μ‚½μž…μ΄ μ•ˆλœκ²½μš°μ΄λ―€λ‘œ ν‹€λ¦° 문자.
if(i == str.length()-1) {
    flag = false;
    break;
}

 

 

2) λ§Œμ•½ 3번 온 λ¬Έμžμ™€ λ‹€μŒ λ¬Έμžκ°€ λ‹€λ₯Όκ²½μš°

AAA -> AAAB

μœ„μ™€ κ°™μ€κ²½μš°λŠ” 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ κ°€μ§œ λ©”μ‹œμ§€λ‹€.

// 문자λ₯Ό ν•œ 번 μ‚½μž…ν•΄μ•Όν•˜λŠ”λ° μ•žλ’€ λ‹€λ₯΄λ©΄ ν‹€λ¦° 문자.
if(str.charAt(i) != str.charAt(i+1)) {
    flag = false;
    break;
}

 

 

3) μœ„ μΌ€μ΄μŠ€μ— 포함이 μ•ˆλ κ²½μš°, λ¬Έμžκ°€ ν•˜λ‚˜λ” μ‚½μž…λœ κ²½μš°μ΄λ―€λ‘œ ν•œμΉΈ λ›°μ–΄λ„˜κ³ , ν•΄λ‹Ή 문자의 횟수λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

// μœ„ μΌ€μ΄μŠ€μ— λͺ¨λ‘ ν¬ν•¨μ•ˆλ˜λ©΄ μ„Έ 번 λ“±μž₯ν•œ λ¬Έμžκ°€ μ‚½μž…λœ κ²½μš°λ―€λ‘œ, ν•œμΉΈ κ±΄λ„ˆλ›΄λ‹€.
i ++;
					
// ν•΄λ‹Ή 문자 횟수 μ΄ˆκΈ°ν™” μ‹œμΌœμ£ΌκΈ°
alpa[str.charAt(i) - 'A'] = 0;

 

 

4) λ§ˆμ§€λ§‰μœΌλ‘œ flag 값을 κΈ°μ€€μœΌλ‘œ trueλ©΄ μ§„μ§œ λ©”μ‹œμ§€, falseλ©΄ κ°€μ§œ λ©”μ‹œμ§€μ΄λ‹€.

result = (flag) ? "OK" : "FAKE";
System.out.println(result);
λ°˜μ‘ν˜•

λŒ“κΈ€