Better Code, Better Life

탑 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

탑 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 7. 26. 17:00

문제 풀이

이 문제는 데이터가 무슨 의미인지, 그리고 이를 어떻게 처리하는지 생각하는데 도움이 된다 (추상화라고 한다).

주어진 것은 heights 즉 타워의 높이로 이루어진 리스트다. 손으로 송신 탑이 신호를 보낼 때, 어떤 탑이 수신하는지 계산해보자. 그리고 이를 모듈화 해보자.

 

송신탑 하나 하나 오른쪽부터 수신탑의 index를 계산해내면 된다.

 

오른쪽부터 구했기 때문에 다시 거꾸로 한다.

 

reversed_heights 의 경우 copydeepcopy를 이용했는데 리스트를 reverse하게 된다면 함수 바깥 참조하고 있던 리스트도 reverse 되게 된다. 이 부분은 한번 deepcopy 없이 실험해보는 것도 좋다. 실험을 통해 함수가 어떻게 데이터를 참조하고 있는지 배워보자.

 

파이썬 얕은 복사, 깊은 복사 - 깊은 복사가 더 느린 편이지만 내부 객체까지 새롭게 복사하기 때문에 안전하다.

변수 전달 추가 자료

클린 코드 작성법

1. while문 내에 for, if문 중첩을 줄인다.
  - 이를 위해서 get_receiver_index 모듈을 만든다.
2. 문제를 이해하기 위한 적절한 변수명을 선언한다.
  - transmitter_height
3. flag 변수 또한 이해하기 쉽게 적절한 변수명을 선언한다.
  - receiver_found
4. 코드 변경의 여지가 있거나 코드 자체로 설명하고 싶다면 함수로 만들자.
  - get_reversed_heights

해답 코드

import copy

def get_reversed_heights(heights):
    heights = copy.deepcopy(heights)
    heights.reverse()
    return heights

def get_receiver_index(transmitter_height, heights):
    reversed_heights = get_reversed_heights(heights)
    length = len(heights)
    receiver_found = False
    for index, height in enumerate(reversed_heights):
        if transmitter_height < height:
            receiver_found = True
            break
    if not receiver_found:
        index = length
    result = length - index
    return result

def solution(heights):
    answer = []
    while heights:
        transmitter_height = heights.pop()
        index = get_receiver_index(transmitter_height, heights)
        answer.append(index)
    answer.reverse()
    return answer

 

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

코딩테스트 연습 - 탑 | 프로그래머스

수평 직선에 탑 N대를 세웠습니다. 모든 탑의 꼭대기에는 신호를 송/수신하는 장치를 설치했습니다. 발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다. 또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다. 예를 들어 높이가 6, 9, 5, 7, 4인 다섯 탑이 왼쪽으로 동시에 레이저 신호를 발사합니다. 그러면, 탑은 다음과 같이 신호를 주고받습니다. 높이가 4인 다섯 번째 탑에서 발사한 신호는 높이가 7인 네 번째 탑이 수신하고, 높이가 7

programmers.co.kr

Comments