Better Code, Better Life

쇠막대기 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

쇠막대기 - 프로그래머스 - 파이썬 풀이

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

문제 풀이

쇠막대기가 중첩될 수록 조각이 많아진다.

"()"를 임의의 기호로 치환해 레이저 포인트를 지정해주자.

그리고 중첩되면 레이저 포인트로 생기는 쇠막대기 수를 증가시키고,

쇠막대기 끝에 도달하면 그 수를 감소시키자.

쇠막대기와 레이저의 표현이 "(" 와 ")"만으로 되어 있기 때문에 문제를 이해하는데 오래 걸렸다.

직접 구현 시, 이보다 더 나은 방식으로 추상화를 하자...

클린 코드 작성법

  1. 코드에는 매직 문자열, 매직 넘버가 없어야 좋다.
    1. 숫자 같은 경우 0과 1만이 적절하다. 이조차도 상수 이름을 지정하면 가독성이 올라간다.
    2. "(" 과 ")"에 적절한 이름을 붙여, 코드 이해도를 높이자.
  2. 뜻이 모호한 arrangementbar_signs로 바꿔주자. 이해가 쉬워진다.

해답 코드

BAR_SIGN = "("
LASER_SIGN = ")"
LASER_POINT = "x"

def solution(arrangement):
    bar_signs = arrangement
    bar_signs = bar_signs.replace("()", LASER_POINT) 
    bar_count = 0
    stacked_bar_num = 0
    for sign in bar_signs:
        if sign == BAR_SIGN:
            bar_count += 1
            stacked_bar_num += 1
        if sign == LASER_SIGN:
            stacked_bar_num -= 1
        if sign == LASER_POINT:
            bar_count += stacked_bar_num
    return bar_count

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

 

문제 링크

 

코딩테스트 연습 - 쇠막대기 | 프로그래머스

여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레이저의 배치는 다음 조건을 만족합니다. - 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다. - 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다. - 레이저는 어

programmers.co.kr

 

Comments