문제풀이/백준oj

[백준OJ] 13022번 늑대와 올바른 단어

Hyeon-Uk 2022. 12. 6. 22:08
반응형

 

 

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

 

13022번: 늑대와 올바른 단어

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

www.acmicpc.net


풀이

'w' = 0, 'o' = 1, 'l' = 2, 'f' = 3 으로 인덱스를 정해준 뒤, 문자열을 탐색하면서 조건을 확인해주었습니다.

  1. 이전 알파벳의 인덱스 == 현재 알파벳의 인덱스
    이 경우에는 해당 인덱스의 cnt를 갱신시켜 줍니다.
  2. 이전 알파벳의 인덱스+1 == 현재 알파벳의 인덱스
    이 경우에는, 이전 알파벳의 인덱스를 갱신시켜주고, 현재 알파벳의 개수를 갱신시켜줍니다.
  3. 현재 알파벳이 w인경우(새로운 wolf의 시작점인 경우)
    현재까지 나온 w,o,l,f의 개수가 모두 일치하는지에 대해 검증합니다.
    검증을 통과하면 cnt배열을 새로 초기화 한 뒤, 이전 알파벳의 인덱스와 현재 알파벳 개수를 갱신시켜 줍니다.
  4. 1~3번 이외의 경우는 잘못된 문자열입니다.

 

시간복잡도

선형 시간안에 해결할 수 있으므로, O(N)이 됩니다.

 

코드

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

public class Main {
    //해당 알파벳을 인덱스로 치환하는 함수
    public static int charToIndex(char c){
        switch(c){
            case 'w':
                return 0;
            case 'o':
                return 1;
            case 'l':
                return 2;
            case 'f':
                return 3;
            default:
                return -1;
        }
    }
    //모든 알파벳들이 동일한 개수인지 확인하는 함수
    public static boolean check(int[] cnt){
        int n = cnt[0];
        for(int i=1;i<4;i++){
            if(cnt[i]!=n) return false;
        }
        return true;
    }

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

        String str = br.readLine();

        int[] cnt = new int[4];
        char prev = str.charAt(0);
        int pIndex = charToIndex(prev);
        cnt[pIndex]++;
        int answer=1;

        for(int i=1;i<str.length();i++){
            char c = str.charAt(i);
            int cIndex = charToIndex(c);
            if(cIndex==pIndex){//이전 문자와 같은 문자일때
                cnt[cIndex]++;
            }
            else if(cIndex == pIndex+1){//이전 문자의 다음번 문자일때
                cnt[cIndex]++;
                pIndex=cIndex;
            }
            else if(cIndex==0){//다음번 w로 넘어갔을때 검증
                if(!check(cnt)) answer = 0;

                Arrays.fill(cnt,0);
                pIndex=cIndex;
                cnt[cIndex]++;
            }
            else{//아닌경우 잘못된 문자열
                answer = 0;
            }
        }
        if(!check(cnt)) answer = 0;
        System.out.println(answer);
    }
}
반응형