12장 연습 문제 8번

8번 문제는 이진 트리 노드 BNode 클래스를 수정하는 문제이다. 문제에서 클래스가 주어지고, 그 클래스를 트리를 구성해서 출력했을 때 출력 결과의 모양을 깔끔하게 보이도록 수정하는 것이다.

이 문제의 핵심은 공백 문자를 재귀적인 리턴이 될 때마다 추가 해주면 되는 것이다.

간단하게 바로 푼다면(내가 답으로 바로 생각한 방법인) if문을 이용해서 리턴값이 None 또는 BNode 일 때마다 공백 문자를 하나씩 늘려주는 방법이다.

실제로 이렇게 풀어도 되긴 하지만 코드가 길어지고 멋이 없다는 생각이 들었다. 그래서 다르게 푸는 방법을 생각 했는데, 리턴값이 리스트였다면 공백으로 묶어주면 될 거라고 생각했지만 __repr__ 메소드는 반드시 문자열을 리턴해야 한다.

그래서 생각한 것이 문자열을 다시 분리시면 된다는 것이다.
class BNode :
    def __init__(self, value=None, left=None, right=None) :
        self.value = value
        self.left = left
        self.right = right
    def __repr__(self) :
        return '\n\t'.join(('%s (\n%s\n%s)' % (self.value, self.left, self.right)).split('\n'))
딱 리턴값 한줄만 바꾸었다. 원래 리턴 결과를 split('\n') 으로 분리 한다음 그것을 '\n\t' 로 묶어버렸다.

처음에는 뒤 포맷 문자열에 대입되는 튜플들의 값을 분리하고 묶었는데, 값이 한개뿐인 리스트라도 분리하고 묶는 것이 가능했다.

그래서 None 객체를 문자열로 변환시키기 위해 str(self.value) 와 같이 사용하고, 그 문자열을 분리하고 묶었다.

그러나 위와 같이 전체 문자열을 분리하고 묶는 방법으로도 원하는 출력값을 얻어낼 수 있다.

댓글 없음:

댓글 쓰기