몽-구
몽구의 우당탕탕 개발 공부
몽-구
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • PS (38)
      • 백준 (24)
      • 프로그래머스 (14)
    • Dev (58)
      • Kotlin (0)
      • Java (4)
      • Spring, SpringBoot (1)
      • C (8)
      • Python (10)
      • Dart (1)
      • 알고리즘 (7)
      • 자료구조 (3)
      • Git (1)
      • Linux (2)
      • VS Code (1)
      • 환경 설정 (8)
      • Conference (1)
      • 42Seoul (3)
      • Node.js (1)
      • ShellScript (1)
      • IntelliJ (0)
      • MacOS (2)
      • 기타 (3)
    • CS (1)
      • 데이터베이스 (1)
    • DS (4)
      • Coursera (4)
    • 리뷰 (1)
      • 제품 리뷰 (1)
    • 일상 (3)
      • 자동화 (1)
      • 목표 및 계획 (2)
      • 회고 (0)
    • 삶에 대한 태도 (1)
      • 유튜브를 보며 (1)

블로그 메뉴

  • GitHub

인기 글

반응형

태그

  • BOJ
  • Algorithm
  • sort
  • 프로그래머스
  • c언어
  • 백준온라인저지
  • 코딩테스트
  • 정렬
  • 파이썬
  • Linux
  • 리눅스
  • 알고리즘
  • 백준
  • 백준알고리즘
  • Python

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
몽-구

몽구의 우당탕탕 개발 공부

[프로그래머스][파이썬/Python] 쇠막대기
PS/프로그래머스

[프로그래머스][파이썬/Python] 쇠막대기

2020. 3. 5. 12:30
반응형

문제 설명

여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레이저의 배치는 다음 조건을 만족합니다.

  • 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다.
  • 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다.
  • 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다.
  • 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않습니다.

아래 그림은 위 조건을 만족하는 예를 보여줍니다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향입니다.

이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있습니다.

  1. 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 '()'으로 표현합니다. 또한 모든 '()'는 반드시 레이저를 표현합니다.
  2. 쇠막대기의 왼쪽 끝은 여는 괄호 '('로, 오른쪽 끝은 닫힌 괄호 ')'로 표현됩니다.

위 예의 괄호 표현은 그림 위에 주어져 있습니다. 쇠막대기는 레이저에 의해 몇 개의 조각으로 잘리는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘리고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘립니다. 쇠막대기와 레이저의 배치를 표현한 문자열 arrangement가 매개변수로 주어질 때, 잘린 쇠막대기 조각의 총 개수를 return 하도록 solution 함수를 작성해주세요.

 

제한 조건

  • arrangement의 길이는 최대 100,000입니다.
  • arrangement의 여는 괄호와 닫는 괄호는 항상 쌍을 이룹니다.

 

입출력 예

 

제출 코드

def solution(arr):
    cnt = 0
    stick_cnt = 0
    
    for i in range(len(arr)):
        if arr[i] == '(':
            stick_cnt += 1
            
        else: # arr[i] == ')'
            if arr[i-1] == '(':
                stick_cnt -= 1
                cnt += stick_cnt
            else: # arr[i-1] == ')'
                stick_cnt -= 1
                cnt += 1
    
    return cnt

(1) line 2, 3

잘린 쇠막대기 조각의 총 개수를 세기 위해 cnt를 선언하고, 현재 놓여진 쇠막대기 개수를 세기 위해 stick_cnt를 선언한다.

 

(2) line 5

모든 괄호를 확인해야 하므로 for문의 반복 횟수는 len(arr)이다.

 

(3) line 6, 7

반복 시 확인된 요소가 '(' 일 경우 일단은 stick_cnt를 1 증가시킨다.

 

(4) line 10 ~ line 12

반복 시 확인된 요소가 ')' 이며, 그 이전의 요소가 '(' 였다면 레이저가 발사되었다는 표현이다. (3)에서 증가시킨 stick_cnt는 잘못 세어졌다고 판단하여 stick_cnt를 1 감소시킨다. 이후 이미 놓여져 있는 쇠막대기들이 레이저에 의해 한 번 절단되었으므로, cnt를 놓여져 있는 쇠막대기의 개수 stick_cnt만큼 증가시킨다.

 

(5) line 13 ~ 15

반복 시 확인된 요소가 ')' 이며, 그 이전의 요소가 ')' 였다면 쇠막대기 하나의 끝을 의미한다. 우선 현재 놓여진 쇠막대기의 개수 stick_cnt를 1 감소시킨다. 이후 절단된 이후(혹은 절단되지 않았을 수도 있다. 그러나 그것은 중요치 않다.) 남은 쇠막대기의 마지막 조각을 반영하기 위해 cnt를 1 증가시킨다.

 

 

 

Source : https://programmers.co.kr/learn/courses/30/lessons/42585

 

반응형
저작자표시 (새창열림)

'PS > 프로그래머스' 카테고리의 다른 글

[프로그래머스][파이썬/Python] 시저 암호  (0) 2020.03.07
[프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리  (0) 2020.03.06
[프로그래머스][파이썬/Python] (2018 카카오 코딩테스트) 비밀지도  (0) 2020.03.04
[프로그래머스][파이썬/Python] 2016년  (0) 2020.03.03
[프로그래머스][파이썬/Python] x만큼 간격이 있는 n개의 숫자  (0) 2020.02.19
    'PS/프로그래머스' 카테고리의 다른 글
    • [프로그래머스][파이썬/Python] 시저 암호
    • [프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리
    • [프로그래머스][파이썬/Python] (2018 카카오 코딩테스트) 비밀지도
    • [프로그래머스][파이썬/Python] 2016년
    몽-구
    몽-구
    소망보단 목표를, 생각보단 실천을

    티스토리툴바