알고리즘
[Swift 알고리즘] 백준 12919 A와 B 2
코코종
2023. 4. 17. 23:05
728x90
안녕하세요 코코종입니다.
오늘도 완전탐색!을 가지고 왔답니다.
첨에 좀 쉬워서 '왜 골드지?' 라고 생각했는데 역시나 틀렸어요 ㅎㅎ... 나눈 바보... 난이도 좀 볼걸
//
// main.swift
// BackJoon
//
// Created by kokojong on 2023/04/16.
//
import Foundation
// 12919 A와 B 2 완전탐색
// 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다
// 문자열의 뒤에 A를 추가한다.
// 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.
var answer = 0
var s = readLine()!.map { return $0 == "A" ? 0 : 1 }
let t = readLine()!.map { return $0 == "A" ? 0 : 1 }
// A -> 0, B -> 1
func change1() { // 문자열 뒤에 A추가
if t.count - s.count == 0 {
if s == t {
answer = 1
}
return
}
s.append(0)
change1()
change2()
s.removeLast()
}
func change2() { // 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다.
if t.count - s.count == 0 {
if s == t {
answer = 1
}
return
}
s.append(1)
s.reverse()
change1()
change2()
s.reverse()
s.removeLast()
}
change1()
change2()
print(answer)
네 완전 탐색으로 s가 t가 될수 있는지 판단하려고 했습니다. 하나하나 해서요! 근데 그랬더니 11퍼 ~ 12퍼에서 딱 시간초과가 뜨더라구요...
그래서 제가 chatGPT한테 물어봤더니 저렇게 말고 dfs로 해보라고 하더라구요? 그래서 stack에 넣고 뭐시기도 해봤는데도 시간초과가 뜨는거에요... 그래서 지피티랑 계속 떠들면서 했는데 결국 아무리해도 시간초과..... 하... 내 기존 코드가 문제인가 해서 다시 노려보고 👀 했는데도 이상한게 없더라구요... 참고로 저는 A B로 두기 싫어서 0과 1로 변경했습니다. 별 차이 없습니다 ㅎㅎ...
그래서 다른 분들의 블로그를 참고했더니 '역으로 오면서 체크'를 하더라구요... 하..... 그냥 완전탐색이라는거 보고 해버렸는데 어떻게 보면 함정?(나혼자 파고 나혼자 들어간) 이라고 생각 되네요. 역시 골드~~
//
// main.swift
// BackJoon
//
// Created by kokojong on 2023/04/17.
//
import Foundation
// 12919 A와 B 2 완전탐색
// 두 문자열 S와 T가 주어졌을 때, S를 T로 바꾸는 게임이다
// 문자열의 뒤에 A를 추가한다. - case1
// 문자열의 뒤에 B를 추가하고 문자열을 뒤집는다. - case2
// 틀렸던 이유: s -> t가 아니라 t -> s로 해야한다.
let s = readLine()!.map { return $0 == "A" ? 0 : 1 }
let t = readLine()!.map { return $0 == "A" ? 0 : 1 }
// A -> 0, B -> 1
let n = t.count - s.count
// 반대로 하니까
// 끝이 A라면 -> case1(A를 빼줌)
// 맨 앞이 B라면 -> case2(뒤집고 맨뒤에 B를 빼줌)
func dfs(arr: [Int]) {
if arr.count == s.count {
if arr == s {
print(1)
exit(0)
}
return
}
let last = arr.last!
if last == 0 {
var tmp = arr
tmp.removeLast()
dfs(arr: tmp)
}
let first = arr.first!
if first == 1 {
var tmp = Array(arr.reversed())
tmp.removeLast()
dfs(arr: tmp)
}
}
dfs(arr: t)
print(0)
T에서 해당하는 것만 dfs로 처리를 해주면 더 좁은 경우의 수만 처리할 수 있다! 라는 결론을 얻었습니다. 머리 쥐어싸매고 고민하느라 재밌었네요(사실 짜증남...)
728x90