본문 바로가기

알고리즘

[백준] 늑대와 올바른 단어 [JAVA]

반응형

출처 : www.acmicpc.net/problem/13022

 

13022번: 늑대와 올바른 단어

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

www.acmicpc.net

문제

다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.

  1. 임의의 양의 정수 n에 대해서, 'w'가 n번 나오고, 그 다음에 'o'가 n번, 그 다음에 'l'이 n번, 그 다음에 'f'가 n번 나온 단어는 올바른 단어이다.
  2. 올바른 단어 두 개를 이은 단어도 올바른 단어이다.
  3. 1번과 2번 조건으로 만들 수 있는 단어만 올바른 단어이다.

다음은 올바른 단어의 예시이다.

  • 1번 규칙으로 만든 "wolf", "wwoollff", "wwwooolllfff"는 모두 올바른 단어이다.
  • 2번 규칙으로 만든 "wolfwwoollff"은 올바른 단어이다.
  • 2번 규칙을 두 번 써서 만든 "wolfwwoollffwolf"은 올바른 단어이다.
  • "wfol"은 올바른 단어가 아니다. (순서가 올바르지 않음)
  • "wwolfolf"는 올바른 단어가 아니다. (문자열의 중간에 다른 문자열을 집어 넣음)
  • "wwwoolllfff"는 올바른 단어가 아니다. (o가 2번 들어갔다)

입력

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

출력

입력으로 주어진 단어가 올바른 단어인 경우에는 1을, 아니면 0을 출력한다.

예제 입력 1

wolf

예제 출력 1

1

예제 입력 2

wwolfolf

예제 출력 2

0

코드

package 알고리즘스터디문제;

import java.util.ArrayList;
import java.util.Scanner;

public class 늑대와올바른단어_13022 {

	static char[] match = {'w', 'o', 'l', 'f' };
	
	public static int solution(String s) {
		
		int answer = 1;
		int idx = 0; // match 번호
		int Charcnt =0 ; // w 이후 문자의 개수
		int Windex =0;
		// 첫 글자가 w 가 아니라면 , 탈락
		if ( s.charAt(0) != match[0]) return 0;
		
		// wcount 담아두자.
		ArrayList<Integer> wcount = new ArrayList<>();
		for ( int i=0; i<s.length(); i++) {
			if ( s.charAt(i) == 'w') {
				Charcnt ++;
			}
			// 같지 않을 때는 초기화
			else {
				// 그전에 w가 있었고, 이번에 w가 없을 경우
				if ( Charcnt > 0) {
					wcount.add(Charcnt);
					Charcnt =0;
				}
			}
			
		}
		Charcnt=1; // 여기까지 온거면 첫 글자는 무조건 w임.
		for( int i=1; i<s.length(); i++) {
			
			// 이전 문자랑 같은지먼저!
			if ( s.charAt(i-1) == s.charAt(i)) {
				// match[idx]랑 비교하고
				if( s.charAt(i) == match[idx]) {		
					Charcnt ++;
				} else {
					return 0;
				}
			}
			// 이전 문자랑 다를 때 ! 
			else {
				// 기록된 Charcnt가 wcount랑 다르면 안됨
				if ( Charcnt != wcount.get(Windex) ) {
					return 0;
				}

				// 달라졌는데 이전문자가 f야 ==> 새로운 w가 등장했다는 소리
				if (s.charAt(i-1) == 'f' ) {
					idx = -1;
					Windex++;
				}
				
				// 이전문자랑 다르고 match[++idx]랑 비교하고 같으면 Charcnt = 1로 초기화
				if ( s.charAt(i) == match[++idx]) {
					
					Charcnt =1;
				} else {
					return 0;
				}
				
			}
		}
		// 마지막은 f로 끝나야하고 f의 개수가 w의 개수랑 다르다면  
		if ( idx != 3 || Charcnt != wcount.get(Windex)) return 0;
		
		return answer ;
	}
	
	
	
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		String input = sc.next();
		
		System.out.println(solution(input));
		// 순서를 정리하자면,
		// 1. w의 개수를 세는 ArrayList를 생성하자.
		// 2. s.charAt(1) 부터 탐색하며,
			// 2-1). 전 값과 현재의 문자형이 같다면 answer [index] 와 비교
				// 2-1-1). 같으면 Charcnt 증가하고 다르다면 , return 0
			// 2-2). 전 값과 현재의 문자형이 다르다면 answer [++index] 와 비교
				// 2-2-1). 기존에 저장되어있던 Charcnt가 w의 개수랑 맞지 않으면 return 0
				// 2-2-2). 이전 값이 'f'라면 새로운 w가 시작되기 때문에  Windex ++ && idx= -1로 초기화 시킨다.
		// 3. 마지막은 언제나 f 로 끝나야하고 그 f숫자는 w의 개수와 동일 해야 한다.
	}
}
반응형