반응형
관련글
그리디 알고리즘 관련 포스팅은 여기를 참조
1. 개요
문제의 링크는 여기를 참조
문제의 내용은 아래의 더보기를 클릭하여 참조
A와 B로만 이루어진 영단어가 있을 때, 영단어 S를 T로 바꿀 수 있는 지 없는 지 구하는 문제
2. 풀이
영단어 T를 다시 S로 만들 수 있는지를 체크하면 문제를 해결할 수 있다.
우선, 영단어 T를 분해하여 각 문자를 Deque 자료구조에 넣어 양 방향에서 뺄 수 있도록 구현한다.
그리고 현재 가장 마지막에 추가된 문자가 어느 위치인지를 체크할 수 있도록 별도의 변수를 만든다. 이를 통해 T → S로 변환하기 위해 어떤 문자를 제외해야 할지를 알 수 있다.
예를 들어, back=1이면, 다음에 뺄 문자는 앞쪽에 있다는 의미이며, back=-1이면 다음에 뺄 문자는 뒤쪽에 있다는 의미이다.(처음에는 -1로 지정한다.)
그래서, 다음에 뺄 문자가 A라면, 해당 문자를 빼고 끝이지만 B라면 뺀 뒤 back에 -1을 곱해 다음 뺄 문자의 위치를 업데이트 해주어야 한다.
이 과정을 반복하여 S의 길이와 T를 분해한 Deque의 크기가 동일한 경우, Deque에서 각 문자를 연결하여 만든 하나의 문자열이 S와 동일한 경우 1을, 아닌 경우 0을 출력한다.
3. 코드
아래의 코드를 통해 정답을 알아보자.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String t = br.readLine();
// t의 모든 문자 하나하나를 Deque에 넣는다.
Deque<Character> dq = new LinkedList<>();
for(int i=0; i < t.length(); i++){
dq.offerLast(t.charAt(i));
}
// 문자열의 앞과 뒤를 설정한다.
// 1이면 Deque의 앞에서 시작한다는 의미이며, -1이면 뒤에서 시작한다는 의미이다.
int back = -1; // 문자열 끝 위치
while(true){
// 문자를 뒤에서 부터 뺀다.
char c = ' ';
if(back == -1) c = dq.pollLast();
else c = dq.pollFirst();
// 뺀 문자가 B이면 뒤집어야 하므로 back을 바꾸어준다.
if(c == 'B'){
back *= -1;
}
// 만약 t에서 문자를 제외한 결과와 s의 길이가 같아졌다면
// 방향에 따라 문자를 연결하여 일치 시 1을 출력하고 아니면 0을 출력한다.
if(s.length() == dq.size()){
String temp = "";
while(!dq.isEmpty()){
if(back == 1){
temp += dq.pollLast();
} else {
temp += dq.pollFirst();
}
}
if(temp.equals(s)){
System.out.println(1);
return;
} else {
System.out.println(0);
return;
}
}
}
}
}
읽어주셔서 감사합니다. 오류가 있으면 지적해주시면 반영하겠습니다.
반응형
'알고리즘 풀이(Problem Solving) > 그리디(Greedy Algorithm)' 카테고리의 다른 글
알고리즘 풀이 - 백준 1201(NMK, 그리디(Greedy)) (0) | 2021.04.19 |
---|---|
알고리즘 풀이 - 백준 12970(AB, 그리디(Greedy)) (0) | 2021.04.18 |
알고리즘 풀이 - 백준 1783(병든 나이트, 그리디(Greedy)) (0) | 2021.04.18 |
알고리즘 풀이 - 백준 10610(30, 그리디(Greedy)) (0) | 2021.04.18 |
알고리즘 풀이 - 백준 2875(대회 or 인턴, 그리디(Greedy)) (0) | 2021.04.14 |