-
반응형
https://www.acmicpc.net/problem/13022
13022번: 늑대와 올바른 단어
첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.
www.acmicpc.net
풀이
'w' = 0, 'o' = 1, 'l' = 2, 'f' = 3 으로 인덱스를 정해준 뒤, 문자열을 탐색하면서 조건을 확인해주었습니다.
- 이전 알파벳의 인덱스 == 현재 알파벳의 인덱스
이 경우에는 해당 인덱스의 cnt를 갱신시켜 줍니다. - 이전 알파벳의 인덱스+1 == 현재 알파벳의 인덱스
이 경우에는, 이전 알파벳의 인덱스를 갱신시켜주고, 현재 알파벳의 개수를 갱신시켜줍니다. - 현재 알파벳이 w인경우(새로운 wolf의 시작점인 경우)
현재까지 나온 w,o,l,f의 개수가 모두 일치하는지에 대해 검증합니다.
검증을 통과하면 cnt배열을 새로 초기화 한 뒤, 이전 알파벳의 인덱스와 현재 알파벳 개수를 갱신시켜 줍니다. - 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); } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 1793 타일링 (Java) (0) 2022.12.15 [백준OJ] 1926번 그림 (0) 2022.12.13 [백준OJ] 13413번 오셀로 재배치 (0) 2022.12.05 [백준OJ] 1707번 이분 그래프 (2) 2022.12.05 [백준OJ] 7795번 먹을 것인가 먹힐 것인가 (0) 2022.11.29 댓글
- 이전 알파벳의 인덱스 == 현재 알파벳의 인덱스