백준 13022 - 늑대와 올바른 단어(Java)
알고리즘/백준

백준 13022 - 늑대와 올바른 단어(Java)

www.acmicpc.net/problem/13022

 

13022번: 늑대와 올바른 단어

첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.

www.acmicpc.net

 

1. 유형

문자열, 구현

 

2. 자료구조

HashMap

 

3. 기능

- w o l f 순서로 연속하는지

- 각 단어가 같은 횟수씩 나왔는지 확인

- 한 싸이클이 끝날때를 확인

 

4. 풀이

문제는 간단하지만 너무 노가다 스러운 문제였다.

 

우선 w o l f를 해쉬맵을 사용해서 0 1 2 3 으로 파싱한다.

그러면 그전 단어와 현재 단어를 비교해서 연속하는지를 알 수 있음.

 

각 단어를 탐색하면서 count배열에다가 각 단어가 몇번 나왔는지를 기록

 

만약 (현재 - 이전)이 -3일 경우 즉, 0 - 3(w - f)인 경우가 한 싸이클이 끝난 경우다.

그렇기 때문에 count배열의 값이 모두 동일 한지를 파악한다.

모두 동일하면 올바른 단어이고, 그게 아니면 올바른 단어가 아니다.

 

끝.

 

코드

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

public class Main {
	static int count[];

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String s = in.readLine();
		if (s.length() < 4) {
			System.out.println(0);
		} else {
			count = new int[4];
			HashMap<Character, Integer> map = new HashMap<>();
			map.put('w', 0);
			map.put('o', 1);
			map.put('l', 2);
			map.put('f', 3);
			boolean flag = true;
			count[map.get(s.charAt(0))] = 1;
			for (int i = 1; i < s.length(); i++) {
				int pre = map.get(s.charAt(i - 1));
				int cur = map.get(s.charAt(i));
				int dif = cur - pre;
				if (dif == -3) {
					if(check()) {
						count = new int[4];
						count[0]=1;
					}else {
						flag=false;
						break;
					}
				} else {
					if (dif == 1 || dif == 0) {
						count[cur]++;
					} else {
						flag=false;
						break;
					}
				}
			}
			if(!check()) {
				flag=false;
			}
			if(flag) {
				System.out.println(1);
			}else
				System.out.println(0);
		}
	}

	static boolean check() {
		if (count[0] == count[1] && count[1] == count[2] && count[2] == count[3]) {
			return true;
		}else
			return false;
	}
}

5. 느낀점

연속을 어떻게 판별할지에서 많이 고민했고, 해쉬맵을 사용해서 파싱을 생각했다.

어려운 bfs,dfs같은 문제보다 체감상 더 어려웠다. 더 연습해야지.