-
Python 백준 9625번 - BABBA (시간 초과 해결)백준문제정리 2021. 1. 25. 23:41728x90반응형
문제
상근이는 길을 걷다가 신기한 기계를 발견했다. 기계는 매우 매우 큰 화면과 버튼 하나로 이루어져 있다.
기계를 발견했을 때, 화면에는 A만 표시되어 있었다. 버튼을 누르니 글자가 B로 변했다. 한 번 더 누르니 BA로 바뀌고, 그다음에는 BAB, 그리고 BABBA로 바뀌었다. 상근이는 화면의 모든 B는 BA로 바뀌고, A는 B로 바뀐다는 사실을 알게 되었다.
버튼을 K번 눌렀을 때, 화면에 A와 B의 개수는 몇 개가 될까?
입력
첫째 줄에 K (1 ≤ K ≤ 45)가 주어진다.
출력
첫째 줄에 A의 개수와 B의 개수를 공백으로 구분해 출력한다.
나의 생각
이 문제는 단순히 A라는 문자를 B 로 바꾸고 B 라는 문자는 BA로 바꾸는 단순한 문제이다. 문제만 보면 단순하기 때문에 처음에는 자신있게 코딩하였다. 이 문제를 블로그에 쓰는 이유는 나와 같은 생각으로 알고리즘을 짠 사람들이 다른 방법이 있다는 것을 알려주기 위함인것과 나도 느낀 부분이 있기 때문이다.
처음에는 단순이 A 라는 문자부터 시작하여 str 객체의 접근하여 원소를 바꿔주면 된다고 생각하였다. 근데 Python을 잘 알다시피 str 객체는 원소 변환이 불가능하다. 물론 str.replace('A','B') 와 trans = str.maketrans("A", "B"), str.translate(trans)와 같은 방법이 있지만 아주 바보 같은 버그가 존재한다. 이것은 직접 디버깅해보면 알게 된다..
그래서 나는 이 str 객체를 list 형식으로 변환하여 문자들을 하나씩 자르고 (str -> list(str): str 객체가 하나씩 잘려서 list 가 생성되는 원리) 리스트로 만든 다음에 이것을 바꿔준 후, 다시 str 객체로 만들면 원하는 변환 문장이 되겠구나 싶어서 코드를 작성하였다. (물론 짜면서도 비효율적인 코드일 것이라고 계속 생각하였지만..)
코드
123456789101112import sysK = int(sys.stdin.readline().rstrip())display = ["A"]for _ in range(K):result = ""for i in range(len(display)):if display[i] == 'A': display[i] = 'B'elif display[i] == 'B': display[i] = 'BA'for j in range(len(display)):result += display[j]display = list(result)print(display.count('A'), display.count('B'))cs 결과
역시나 시간 초과가 난다. 사실 알면서도 혹시나? 하는 마음에 시도해 보았다..
다른 생각
내가 생각한 flow는 맞지만 이것은 좋은 코드가 아니라는 생각을 하였다. 그래서 원초적인 방법으로 이 알고리즘에 수학적 규칙이 있을까?라는 생각부터 하였다. 그리고 출력문을 잘 보면, A와 B의 원소 개수를 따로 출력해주는 것이 핵심일 것이라는 생각이 들었다. 그래서 길이 2짜리 A와B의 갯수를 담고 있는 list를 만든 다음 처음부터 갯수를 찍어 보았다. 그러고 보니 A는 B로 된다는 것은 A의 개수가 B 의 갯수로 채워진다는 것이고, B 는 A와 B 모두에 갯수가 채워진다는 것을 알아내었다. 구현한 코드이다.
코드
123456import sysK = int(sys.stdin.readline().rstrip())AB = [1, 0]for _ in range(K):AB[0], AB[1] = AB[1], AB[0]+AB[1]print(AB[0], AB[1])cs 결과
느낀 점
이 문제는 레벨도 브론즈인 만큼 간단한 문제이다. 하지만 내가 블로그로 남기는 이유는, 항상 수학적 규칙? 을 생각하기 이전에 기계적으로만 코드를 짰던 방식에서, 문제에 대해서 조금 더 생각을 해보고 규칙성이나 키 포인트를 찾아낸 후 구현해야겠다고 느낀 것이다. 다른 문제에서는 조금 더 신중하고 생각을 많이 해봐야겠다.
반응형'백준문제정리' 카테고리의 다른 글
Python 백준 1495번 - 기타리스트 (메모리 초과 해결) (0) 2021.05.19 Python 백준 10610번 - 30 (시간 초과 해결) (0) 2021.02.04 Python 백준 8320번 - N-Queen, 백트래킹 알고리즘과 pruning(가지치기) (0) 2021.01.17 Python 백준 8320번 - 직사각형을 만드는 방법 (시간 초과 해결) (0) 2021.01.16 Python 백준 10250번 - ACM호텔 (0) 2021.01.12