728x90
(( 한 번 다시 봐도 좋을 문제 ))
문제 링크
https://www.acmicpc.net/problem/12919
TIL
- 반대로 생각해보는 연습하기 (거꾸로)
- 문제에서 S에 1) 끝에 A를 추가하거나 2) 끝에 B를 추가한뒤 배열 뒤집기를 요구했으니
- 반대로 T에서 1) 끝에서 A를 제거하거나 2) 배열을 뒤집고 B를 제거하는 것을 해볼 수 있음 !!
- 다만 전체 배열로 비교하는 것은 까다롭고, 비효율적이니 T의 마지막 문자를 기준으로 확인하는 게 좋음
- 재귀에서는 연속된 return 처리 필수
- 모든 경우의 수를 봐야하는 경우에는 꼭 이렇게 재귀형식으로 해야함
- 처음 코드의 경우, 모든 경우의 수를 볼 수 없음 >> 틀린 이유
[ 처음 코드] - TC는 모두 돌아가나, 정답 제출 실패
import copy
S = list(input())
T = list(input())
for i in range(len(T)):
if S == T:
print(1); exit()
next_A = copy.deepcopy(S); next_B = copy.deepcopy(S)
next_A.append('A')
next_B.append('B'); next_B = next_B[::-1]
if next_A == T[:len(S)+1]:
S.append('A')
elif next_B == T[:len(S)+1]:
S.append('B')
S = S[::-1]
else:
print(0); exit()
- 좋은 코드라고 생각되지 않음
- 불필요한 메모리 사용이 너무 많고, 시간 측면에서도 효율적인거 같진 않음
Code
[ 내 코드 ]
S = list(input())
T = list(input())
# 재귀를 사용하지 않으면 모든 경우의 수를 확인할 수가 없어서 틀리게 됨
# T가 BA이고, S가 A인 경우, A를 제거하고 B만 남은 경우만 고려하게 될 수 있음
# 가지치기가 포함된 완전 탐색 필요 ~ 뭐 일종의 백트래킹
def compare_last(t):
if len(t)==0:
return 0
if t == S:
return 1
if t[-1] == 'A':
ret = compare_last(t[:-1])
if ret == 1:
return 1
if t[0] == 'B':
t = t[::-1]
ret = compare_last(t[:-1])
if ret == 1:
return 1
print(1) if compare_last(T)==1 else print(0)
- 재귀이기때문에 연속된 Return을 처리하지 않으면 틀림 !!
- 재귀의 형태나 매개변수는 자유롭게 설정 가능
[ 다른 사람 코드 참고용 ]
def canTransform(t, s):
if t == s:
return True
if len(t) < len(s):
return False
result = False
if t[-1] == 'A':
result |= canTransform(t[:-1], s)
if t[0] == 'B':
result |= canTransform(t[1:][::-1], s)
return result
S = input()
T = input()
print(1 if canTransform(T, S) else 0)
- 나처럼 Return해서 표현할 수도 있지만 위 코드처럼 T/F로 두고, or 연산 처리 가능 !!
- 기억해두기
s = input()
t = input()
answer = 0
def sub(str1, target):
global answer
if len(str1) == len(target):
if target == str1:
answer = 1
return
if target[-1] == 'A':
sub(str1, target[:-1])
if target[0] == 'B':
#target = target
sub(str1, target[:0:-1])
sub(s, t)
print(answer)
- 리스트로 받지 않고도 이렇게 표현 가능
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 2294번: 동전 2 (DP) (0) | 2025.04.18 |
---|---|
[BOJ] 2293번: 동전 1 (DP) (1) | 2025.04.17 |
[BOJ] 1931번: 회의실 배정 (Greedy) (0) | 2025.04.15 |
[BOJ] 1541번: 잃어버린 괄호 (Greedy) (0) | 2025.04.15 |
[BOJ] 1916번: 최소비용 구하기 (Dijkstra) (0) | 2025.04.06 |