본문 바로가기
온라인 저지/BOJ

[BOJ/Python] 2447 별 찍기 - 10, 11729 하노이 탑 이동 순서

by ahj 2021. 10. 3.

알고리즘 문제 풀다보면 시간복잡도 때문에 약간 강박적으로 for문을 안쓰려고 해서 재귀함수가 이에 대한 해답이 될 줄 알았더니 오히려 성능이 더 떨어진다니.. 섭섭하다. 아무튼 for문 잘 써보자

<2447 별 찍기 - 10>

# 별찍는 함수 만들기
def square(number):

    # 주어지는 number가 3일 때가 가장 기본 형태 
    if number == 3:
        star = ['***','* *','***']
        return star

    # number가 3이 아닌 3의 거듭제곱일 때 재귀함수 이용
    else:
        # 리스트 star의 길이는 number
        star = [''] * number
        
        # square(number//3)의 리스트로부터 number에 대한 star을 만들어줌
        for i, s in enumerate(square(number//3)):

            # 새로운 star는 square(number//3)의 3배 길이이므로 i, i+(number//3), i+(number//3)*2마다 규칙성 생김
            # star[i]와 star[i+(number//3)*2]는 s의 3배를 해준 값
            # star[i+(number//3)]은 s + (number//3)만큼의 공백 + s 의 값
            star[i] = s*3
            star[i+(number//3)] = s + ' ' * (number//3) + s
            star[i+(number//3)*2] = s*3

        return star


number = int(input())

# square(number)는 number길이 만큼의 리스트 형태이므로 요소별로 출력
for s in square(number):
    print(s)

이 문제는 fractal처럼 논리는 너무 간단했는데 구현해서 출력하기가 너무 어려웠다.. 결국 검색을 통해 정답을 공부하고 풀었다.

각 줄을 하나의 list item으로 재귀함수마다 저장해주면 됐다. 혼자서 몇시간을 끙끙 거릴때는 * 하나하나마다 2차원 배열의 item으로 저장하려고 애쓰고 구현도 못하고.. 쉽지가 않다. 재귀가 많이 약한가보다 난

 

이런 아이디어를 어떻게 떠올려야 하는가.. 공부가 더 필요한건지 다른 풀이를 보고나면 이해는 잘 되는데, 한단계씩 손코딩하는 것도 나름 재미는 있다. 계속하다보면 늘겠지 싶다.

 

다음으로 하노이 탑 문제

<11729 하노이 탑 이동 순서>

하노이탑 역시 논리 자체는 너무 단순한데 매번 어디에서 어디로 이동하는지 출력하는 것을 구현하는게 너무 어려웠다.

아래와 같은 깔끔한 생각, 유연한 생각을 하지 못해서 그저 무식하게 다 작성하고 규칙을 찾아보려고 몇시간을 용썼다 아주 홀수 입력시는 13 32 21 짝수는 12 23 31 와 같은 규칙... 이마저도 문제 조건과 비교하니까 틀렸다.

아직도 컴퓨터를 잘 이용하지 못한다니!!! 논리 잘 짜서 코딩좀 잘 해보자...

def hanoi(n, i, via, j):
  if n==1:#이동할 원반이 1개일 때
    print(f"{i} {j}")
    return
  hanoi(n-1, i, j, via)#n-1개 원반을 경유지로 이동
  print(f"{i} {j}")#남은 1개의 원반 n을 이동
  hanoi(n-1, via, i, j)#n-1개 원반 경유지에서 j로 이동
  return    

n=int(input())
print(2**n-1)
hanoi(n, 1, 2, 3)

하노이탑 문제야 말로 재귀함수를 이용해 완전 수학처럼 푼것 같아서 재밌다.

기본 아이디어들은 역시 검색을 통해 가져왔다. 아직도 함수 여러 변수들을 이용해 문제해결하는 능력은 부족하다.

어느면에서는 생각이 참 갇혀있는 것 같기도 하고

하노이는 결국 3개 칸에서 왔다갔다 하는 거니까 from, via, to를 지정해서 이용할 수 있다는 이 단순한 생각. 왜 못했을까

막상 해결하고보니 좀 예쁜 코드이기까지 하다(?)ㅎㅎ 복잡할 수도 있었는데

'온라인 저지 > BOJ' 카테고리의 다른 글

[BOJ/Python] 16926 배열 돌리기 1  (0) 2022.01.19
[BOJ/Python] 15649 N과 M(1)  (0) 2021.10.15
[BOJ/C] 15757 큰 수 A+B  (0) 2021.09.27
[BOJ/C]1157 단어 공부  (0) 2021.09.25
[BOJ/C]2675 문자열 반복  (0) 2021.09.25

댓글