백준 13022[자바] java 늑대와 올바른 단어
문제 링크: https://www.acmicpc.net/problem/13022
▶문제
다음은 늑대 나라에서 사용하는 올바른 단어에 대한 설명이다.
- 임의의 양의 정수 n에 대해서, 'w'가 n번 나오고, 그다음에 'o'가 n번, 그다음에 'l'이 n번, 그다음에 'f'가 n번 나온 단어는 올바른 단어이다.
- 올바른 단어 두 개를 이은 단어도 올바른 단어이다.
- 1번과 2번 조건으로 만들 수 있는 단어만 올바른 단어이다.
다음은 올바른 단어의 예시이다.
- 1번 규칙으로 만든 "wolf", "wwoollff", "wwwooolllfff"는 모두 올바른 단어이다.
- 2번 규칙으로 만든 "wolfwwoollff"은 올바른 단어이다.
- 2번 규칙을 두 번 써서 만든 "wolfwwoollffwolf"은 올바른 단어이다.
- "wfol"은 올바른 단어가 아니다. (순서가 올바르지 않음)
- "wwolfolf"는 올바른 단어가 아니다. (문자열의 중간에 다른 문자열을 집어 넣음)
- "wwwoolllfff"는 올바른 단어가 아니다. (o가 2번 들어갔다)
▶입력
첫째 줄에 단어가 주어진다. 단어는 w, o, l, f로만 이루어져 있으며, 길이는 50을 넘지 않는다.
▶출력
입력으로 주어진 단어가 올바른 단어인 경우에는 1을, 아니면 0을 출력한다.
▶해설
str의 인덱스를 하나씩 증가시키며 조건을 확인하는 문제입니다. 조건을 살펴보겠습니다.
1. w, o, l, f는 순서대로 와야 한다.
2. 등장하는 개수가 같아야 한다 (ex: wwoollff)
문제를 접했을 때 State 즉 상태를 나눠서 풀면 좋을 거 같다고 생각했습니다. 그래서 Enum을 활용해서 총 5가지의 상태로 나눴습니다.
1. Start 상태 2가지의 경우의 수
처음 시작하는 단계이므로 w가 와야 합니다.
1-1. w가 아닐 경우 0을 출력하고, 종료합니다.
1-2. w일 경우 w 개수를 세는 wCount를 1 증가시키고, State를 W 상태로 변경합니다.
if (state == State.START) {
if (str.charAt(i) != 'w') {
System.out.println(0);
return;
}
wCount++;
state = State.W;
}
2. W 상태 3가지의 경우의 수
2-1. w가 들어온다면, wCount를 1씩 증가시킵니다.
2-2. o가 들어온다면, oCount를 증가시키고, State를 O 상태로 변경합니다.
2-3. 다른 무언가가 들어온다면 0을 출력하고 종료합니다.
else if (state == State.W) {
if (str.charAt(i) == 'w') {
wCount++;
}
else if(str.charAt(i) == 'o'){
state = State.O;
oCount++;
}
else{
System.out.println(0);
return;
}
}
3. O 상태 3가지 경우의 수
3-1. o가 들어온다면, oCount를 증가시킵니다.
3-2. l이 들어온다면 wCount와 oCount를 비교하여 다르면 0 출력 종료하고, 같다면 State L로 변경하고, lCount를 1 증가시킵니다.
3-3. 다른 무언가가 들어온다면 0을 출력하고 종료합니다.
else if (state == State.O) {
if (str.charAt(i) == 'o') {
oCount++;
} else if(str.charAt(i) =='l'){
if (wCount != oCount) {
System.out.println(0);
return;
}
state = State.L;
lCount++;
}else{
System.out.println(0);
return;
}
}
4. L 상태 3가지 경우의 수
3-1. l가 들어온다면, lCount를 증가시킵니다.
3-2. f이 들어온다면 oCount와 lCount를 비교하여 다르면 0 출력 종료하고, 같다면 State F로 변경하고, fCount를 1증가시킵니다.
3-3. 다른 무언가가 들어온다면 0을 출력하고 종료합니다.
else if (state == State.L) {
if (str.charAt(i) == 'l') {
lCount++;
} else if(str.charAt(i) =='f'){
if (oCount != lCount) {
System.out.println(0);
return;
}
state = State.F;
fCount++;
}
else{
System.out.println(0);
return;
}
}
5. F 상태 3가지 경우의 수
3-1. f가 들어온다면, fCount를 증가시킵니다.
3-2. w가 들어온다면 lCount와 fCount를 비교하여 다르면 0 출력 종료하고, 같다면 State Start로 변경하고, 모든 Count들을 0으로 변경하고, 인덱스를 -1 해줍니다.(Start 상태에서 연산을 진행하기 위해서)
3-3. 다른 무언가가 들어온다면 0을 출력하고 종료합니다.
else{
if (str.charAt(i) == 'f') {
fCount++;
}
else if(str.charAt(i) =='w'){
if (lCount != fCount) {
System.out.println(0);
return;
}
state = State.START;
wCount = 0;
oCount = 0;
lCount = 0;
fCount = 0;
i -= 1;
}
else{
System.out.println(0);
return;
}
}
6. 문장이 끝났을 때
문장이 끝났으므로 State에서는 비교 연산을 진행할 수 없습니다. 그래서 마지막으로 wCount와 fCount를 비교해서 정답을 출력합니다.
if (wCount != fCount) {
System.out.println(0);
} else {
System.out.println(1);
}
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
enum State {
START,
W,
O,
L,
F
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int n = str.length();
State state = State.START;
int wCount = 0;
int oCount = 0;
int lCount = 0;
int fCount = 0;
solve(str, n, state, wCount, oCount, lCount, fCount);
}
private static void solve(String str, int n, State state, int wCount, int oCount, int lCount, int fCount) {
for (int i = 0; i < n; i++) {
if (state == State.START) {
if (str.charAt(i) != 'w') {
System.out.println(0);
return;
}
wCount++;
state = State.W;
} else if (state == State.W) {
if (str.charAt(i) == 'w') {
wCount++;
}
else if(str.charAt(i) == 'o'){
state = State.O;
oCount++;
}
else{
System.out.println(0);
return;
}
} else if (state == State.O) {
if (str.charAt(i) == 'o') {
oCount++;
} else if(str.charAt(i) =='l'){
if (wCount != oCount) {
System.out.println(0);
return;
}
state = State.L;
lCount++;
}else{
System.out.println(0);
return;
}
} else if (state == State.L) {
if (str.charAt(i) == 'l') {
lCount++;
} else if(str.charAt(i) =='f'){
if (oCount != lCount) {
System.out.println(0);
return;
}
state = State.F;
fCount++;
}
else{
System.out.println(0);
return;
}
} else{
if (str.charAt(i) == 'f') {
fCount++;
}
else if(str.charAt(i) =='w'){
if (lCount != fCount) {
System.out.println(0);
return;
}
state = State.START;
wCount = 0;
oCount = 0;
lCount = 0;
fCount = 0;
i -= 1;
}
else{
System.out.println(0);
return;
}
}
}
if (wCount != fCount) {
System.out.println(0);
} else {
System.out.println(1);
}
}
}
'Alogorithm > 문자열' 카테고리의 다른 글
백준 1786[자바] java 찾기 (0) | 2022.05.16 |
---|---|
백준 JAVA 17413번 단어 뒤집기 2 (0) | 2021.12.27 |
백준 JAVA 16916번 부분 문자열 (0) | 2021.12.25 |
백준 JAVA 17609번 회문 (0) | 2021.12.24 |
댓글
이 글 공유하기
다른 글
-
백준 1786[자바] java 찾기
백준 1786[자바] java 찾기
2022.05.16 -
백준 JAVA 17413번 단어 뒤집기 2
백준 JAVA 17413번 단어 뒤집기 2
2021.12.27 -
백준 JAVA 16916번 부분 문자열
백준 JAVA 16916번 부분 문자열
2021.12.25 -
백준 JAVA 17609번 회문
백준 JAVA 17609번 회문
2021.12.24