문제
https://www.acmicpc.net/problem/12904
12904번: A와 B
수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수
www.acmicpc.net
풀이
- T의 마지막 인덱스와 S의 길이를 저장
- T의 마지막 인덱스의 글자를 가져와 저장하고, T를 0~마지막 인덱스-1까지 자름
- T의 마지막 글자가 B이면 T를 뒤집음
- 2~3번째 과정을 T의 길이와 S의 길이가 같을 때까지 반복
- T와 S가 같으면 1, 아니면 0을 출력
소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = bufferedReader.readLine();
String t = bufferedReader.readLine();
int lastIndex = t.length() - 1;
int sLength = s.length();
while (t.length() != sLength) {
char lastCharacter = t.charAt(lastIndex);
t = t.substring(0, lastIndex--);
if (lastCharacter == 'B') {
t = new StringBuffer(t).reverse().toString();
}
}
if (t.equals(s)) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
문자열을 자르지 않고, 인덱스를 이용해 개선
- 인덱스가 마지막이면 true, 마지막이 아니면(처음이면) false를 담을 isLast 변수 선언
- isLast가 참이면 마지막 문자 하나를 삭제하고, 거짓이면 첫 문자를 삭제
- 문자열이 B이면 isLast를 반전
- 가장 마지막 삭제 문자에 대한 반전 여부가 반영되지 않았으므로 반복 종료 후 뒤집기 여부 확인
- isLast가 거짓이면 마지막 글자가 B였다는 의미이므로 문자열을 뒤집음
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = bufferedReader.readLine();
String t = bufferedReader.readLine();
int lastIndex = t.length() - 1;
int sLength = s.length();
boolean isLast = true;
while (t.length() != sLength) {
char lastCharacter;
if (isLast) {
lastCharacter = t.charAt(lastIndex);
t = t.substring(0, lastIndex);
} else {
lastCharacter = t.charAt(0);
t = t.substring(1);
}
lastIndex--;
if (lastCharacter == 'B'){
isLast = !isLast;
}
}
if (!isLast) {
t = new StringBuffer(t).reverse().toString();
}
if (t.equals(s)) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
Deque을 이용해 개선
- 인덱스 사용과 마찬가지로 isLast에 문자열의 마지막 문자를 자를지, 첫 문자를 자를지 결정
- Deque를 이용해 문자열을 자르지 않고, 요소 제거를 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String s = bufferedReader.readLine();
String t = bufferedReader.readLine();
Deque<Character> deque = new ArrayDeque<>();
for (int i = 0; i < t.length(); i++) {
deque.offer(t.charAt(i));
}
int sLength = s.length();
boolean isLast = true;
while (deque.size() != sLength) {
char lastCharacter;
if (isLast) {
lastCharacter = deque.removeLast();
} else {
lastCharacter = deque.removeFirst();
}
if (lastCharacter == 'B') {
isLast = !isLast;
}
}
StringBuilder stringBuilder = new StringBuilder();
if (isLast) {
while (deque.size() > 0) {
stringBuilder.append(deque.removeFirst());
}
} else {
while (deque.size() > 0) {
stringBuilder.append(deque.removeLast());
}
}
if (stringBuilder.toString().equals(s)) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
'algorithm > Baekjoon Online Judge' 카테고리의 다른 글
[BOJ] 4991 로봇 청소기(Java) (0) | 2023.02.20 |
---|---|
[BOJ] 17141 연구소 2(Java) (0) | 2023.01.11 |
[BOJ] 21939 문제 추천 시스템 Version 1(Java) (0) | 2022.12.14 |
[BOJ] 10157 자리배정(Java) (0) | 2022.02.27 |