Notice
                              
                          
                        
                          
                          
                            Recent Posts
                            
                        
                          
                          
                            Recent Comments
                            
                        
                          
                          
                            Link
                            
                        250x250
    
    
  | 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
                            Tags
                            
                        
                          
                          - SQL 고득점 KIT
- 동적계획법
- Baekjoon
- javascript
- 티스토리챌린지
- 백준
- join
- 소프티어
- softeer
- Lv. 2
- Python
- Lv. 0
- 오블완
- Lv. 1
- dfs
- 너비 우선 탐색
- programmers
- DP
- 파이썬
- level 3
- LEVEL 2
- 깊이 우선 탐색
- Dynamic Programming
- 프로그래머스
- Lv. 3
- group by
- 자바스크립트
- Java
- bfs
- SQL
                            Archives
                            
                        
                          
                          - Today
- Total
몸과 마음이 건전한 SW 개발자
백준 GOLD 5 [12919번] A와 B 2 {언어 : Python} [반례 포함] 본문
728x90
    
    
  문제 링크
https://www.acmicpc.net/problem/12919
정답 코드
s = input()
t = input()
lenS = len(s)
lenT = len(t)
answer = 0
def isIncluded(arr):
    normarlString = "".join(arr)
    reversString = "".join(arr[::-1])
    return normarlString in t or reversString in t
def dfs(length, arr):
    global answer
    if answer:
        return
    if length == lenT:
        string = "".join(arr)
        if string == t:
            answer = 1
        return
    if isIncluded(arr+["A"]):
        dfs(length+1, arr+["A"])
    if isIncluded(["B"] + arr[::-1]):
        dfs(length+1, ["B"] + arr[::-1])
dfs(lenS, list(s))
print(answer)풀이 방법
- 길이가 lenT와 같아지면 종료되는 재귀함수를 만든다.
- 만약 이미 바꿀 수 있음을 확인했다면 종료시킨다.
- 재귀가 최대 2^50 = 1,125,899,906,842,624번 연산이 될 수 있다.
-  따라서 바꾸려고 하는 문자열이 t에 있는지 확인하고 재귀를 돌린다.
- 여기서 문자열을 뒤집어서도 확인 해봐야 한다.
- 그렇지 않으면 다음과 같은 반례가 나온다.
- s = AB
- t = BABB
- 답 = 1
- 오답 = 0
 
 
-  따라서 바꾸려고 하는 문자열이 t에 있는지 확인하고 재귀를 돌린다.
- 연산이 끝나면 answer를 출력한다

느낀점
- 항상 반례가 있다는 점을 명심하자.
728x90
    
    
  '알고리즘' 카테고리의 다른 글
| 프로그래머스 [Lv. 2] 서버 증설 횟수 {언어 : JavaScript} (0) | 2025.03.12 | 
|---|---|
| 백준 SILVER 3 [3273번] 두 수의 합 {언어 : Python} (0) | 2025.02.11 | 
| 코드트리 | HashMap / 자주 등장한 top k 숫자 {언어 : Python} (0) | 2025.01.15 | 
| Softeer [Level 2] 나무 공격 {언어 : JavaScript} (2) | 2024.11.08 | 
| Softeer [Level 3] [한양대 HCPC 2023] Pipelined {언어 : JavaScript} (1) | 2024.11.01 | 
 
                   
                  