12919번: A와 B 2
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수빈
www.acmicpc.net
문제
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.
이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.
- 문자열의 뒤에 A를 추가한다.
- 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.
주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 S가 둘째 줄에 T가 주어진다. (1 ≤ S의 길이 ≤ 49, 2 ≤ T의 길이 ≤ 50, S의 길이 < T의 길이)
출력
S를 T로 바꿀 수 있으면 1을 없으면 0을 출력한다.
코드
처음 풀이한 코드 => 시간 초과
s = input()
t = input()
def dfs(x):
if len(x) == len(t):
if x == t:
print(1)
exit()
else:
return
dfs(x+'A')
dfs((x+'B')[::-1])
return
dfs(s)
print(0)
S에서 T를 만들어내도록 DFS를 만들어봤는데 이렇게 하면 최대 시간 복잡도가 O(2^N) (N은 S와 T의 길이차)로 시간 효율성이 매우 좋지 않다.
정답 코드
s = input()
t = input()
def dfs(x):
if len(x) == len(s):
if x == s:
print(1)
exit()
else:
return
if x[-1] == 'A':
dfs(x[:-1])
if x[0] == 'B':
dfs(x[::-1][:-1])
return
dfs(t)
print(0)
T에서 S를 만들 수 있는지 확인해보도록 바꿨다. 무슨 차이가 있냐 하겠지만 여기서는 문자열을 미리 살펴서 다음 DFS를 실행할지 결정할 수 있기 때문에 DFS의 실행 횟수를 줄일 수 있다.
'문제풀이 > 완전탐색' 카테고리의 다른 글
[Python/파이썬] 백준 18511번 큰 수 구성하기 (0) | 2023.04.26 |
---|---|
[Python/파이썬] 백준 15721번 번데기 (0) | 2023.04.26 |
[Python/파이썬] 백준 15661번 링크와 스타트 (0) | 2023.03.02 |
[Python/파이썬] 백준 2615번 오목 (0) | 2023.03.01 |
[Python/파이썬] 백준 2961번 도영이가 만든 맛있는 음식 (0) | 2023.03.01 |
12919번: A와 B 2
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수빈
www.acmicpc.net
문제
수빈이는 A와 B로만 이루어진 영어 단어 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다.
이런 사실에 놀란 수빈이는 간단한 게임을 만들기로 했다. 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다. 문자열을 바꿀 때는 다음과 같은 두 가지 연산만 가능하다.
- 문자열의 뒤에 A를 추가한다.
- 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.
주어진 조건을 이용해서 S를 T로 만들 수 있는지 없는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 S가 둘째 줄에 T가 주어진다. (1 ≤ S의 길이 ≤ 49, 2 ≤ T의 길이 ≤ 50, S의 길이 < T의 길이)
출력
S를 T로 바꿀 수 있으면 1을 없으면 0을 출력한다.
코드
처음 풀이한 코드 => 시간 초과
s = input() t = input() def dfs(x): if len(x) == len(t): if x == t: print(1) exit() else: return dfs(x+'A') dfs((x+'B')[::-1]) return dfs(s) print(0)
S에서 T를 만들어내도록 DFS를 만들어봤는데 이렇게 하면 최대 시간 복잡도가 O(2^N) (N은 S와 T의 길이차)로 시간 효율성이 매우 좋지 않다.
정답 코드
s = input() t = input() def dfs(x): if len(x) == len(s): if x == s: print(1) exit() else: return if x[-1] == 'A': dfs(x[:-1]) if x[0] == 'B': dfs(x[::-1][:-1]) return dfs(t) print(0)
T에서 S를 만들 수 있는지 확인해보도록 바꿨다. 무슨 차이가 있냐 하겠지만 여기서는 문자열을 미리 살펴서 다음 DFS를 실행할지 결정할 수 있기 때문에 DFS의 실행 횟수를 줄일 수 있다.
'문제풀이 > 완전탐색' 카테고리의 다른 글
[Python/파이썬] 백준 18511번 큰 수 구성하기 (0) | 2023.04.26 |
---|---|
[Python/파이썬] 백준 15721번 번데기 (0) | 2023.04.26 |
[Python/파이썬] 백준 15661번 링크와 스타트 (0) | 2023.03.02 |
[Python/파이썬] 백준 2615번 오목 (0) | 2023.03.01 |
[Python/파이썬] 백준 2961번 도영이가 만든 맛있는 음식 (0) | 2023.03.01 |