ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 백준 9625번 - BABBA (시간 초과 해결)
    백준문제정리 2021. 1. 25. 23:41
    반응형

    문제

    상근이는 길을 걷다가 신기한 기계를 발견했다. 기계는 매우 매우 큰 화면과 버튼 하나로 이루어져 있다.

    기계를 발견했을 때, 화면에는 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 객체로 만들면 원하는 변환 문장이 되겠구나 싶어서 코드를 작성하였다. (물론 짜면서도 비효율적인 코드일 것이라고 계속 생각하였지만..)

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import sys
    = 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 모두에 갯수가 채워진다는 것을 알아내었다. 구현한 코드이다.

     

    코드

    1
    2
    3
    4
    5
    6
    import sys
    = int(sys.stdin.readline().rstrip())
    AB = [10]
    for _ in range(K):
        AB[0], AB[1= AB[1], AB[0]+AB[1]
    print(AB[0], AB[1])
    cs

    결과

     

    느낀 점

    이 문제는 레벨도 브론즈인 만큼 간단한 문제이다. 하지만 내가 블로그로 남기는 이유는, 항상 수학적 규칙? 을 생각하기 이전에 기계적으로만 코드를 짰던 방식에서, 문제에 대해서 조금 더 생각을 해보고 규칙성이나 키 포인트를 찾아낸 후 구현해야겠다고 느낀 것이다. 다른 문제에서는 조금 더 신중하고 생각을 많이 해봐야겠다.

    반응형
Designed by Tistory.