RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스>LV4] 올바른 괄호의 개수(Kotlin/Python)

2023. 4. 3. 13:54
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제

[입력]

괄호 쌍의 개수 n

[결과]

n개의 괄호 쌍으로 만들 수 있는 모든 가능한 괄호 문자열의 갯수를 반환

 

2. 풀이

🌹 DP를 이용해 풀 수 있는 문제입니다.

 

DP를 어떻게 설정할 수 있을까요?

i개의 괄호로 만들 수 있는 올바론 괄호의 개수를 dp[i]라 할 때,

👇🏻 아래와 같이 구성될 수 있다는 것을 알 수 있습니다.

이 때, 한쪽은 반드시 ( ... ) 형태로 만들 수 있는 경우의 수만 계산해야 합니다.

👈🏻 왼쪽처럼 구별없이 경우의 수를 계산할 경우에는 중복되는 경우가 있을 수 있습니다. 😱 

때문에 👉🏻오른쪽과 같이 한쪽은 반드시 (...) 형태로 구성되도록 강제해야 합니다.

 

이를 위해 (...) 형태의 경우의 수만 저장하는 새로운 DP 배열이 필요하게 됩니다.

dp1 = [0] * (n+1)
dp2 = [0] * (n+1)

 

그렇다면 DP는 어떻게 계산하면 될까요?

dp2는 (...) 형태여야 하기 때문에 👇🏻 아래와 같이 계산할 수 있습니다.

dp2[i] = dp1[i-1]

 

dp1는 어떻게 구할 수 있을까요?

한쪽은 a개의 괄호쌍으로 만들 수 있는 올바른 괄호의 개수,

오른쪽은 b개의 괄호쌍으로 만들 수 있는 올바른 괄호의 개수 중 (...) 형태인 경우의 수이고

이 둘을 곱해주면 a / b 로 구성된 올바른 괄호의 개수를 만드는 경우의 수를 고할 수 있습니다.

dp1[i] = sum([dp1[i-k] * dp2[k] for k in range(i+1)])

 

위 내용들을 모두 합쳐 코드를 구현하면 아래와 같습니다.

3. 코드

Kotlin
class Solution {
    fun solution(n: Int): Int {
        val dp1 = IntArray(n + 1)
        val dp2 = IntArray(n + 1)
        dp1[0] = 1

        (1..n).forEach {
            dp2[it] = dp1[it - 1]
            dp1[it] = (0..it).sumOf { k -> dp1[it - k] * dp2[k] }
        }
        return dp1.last()
    }
}
Python
def solution(n):
    dp1 = [0] * (n+1)
    dp2 = [0] * (n+1)
    dp1[0] = 1
    
    for i in range(1,n+1):
        dp2[i] = dp1[i-1]
        dp1[i] = sum([dp1[i-k] * dp2[k] for k in range(i+1)])
    return dp1[-1]
반응형

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

[프로그래머스 > LV2] 요격 시스템(Kotlin)  (0) 2023.04.23
[프로그래머스>LV2] 연속된 부분 수열의 합 (Kotlin, Python)  (0) 2023.04.10
[프로그래머스>LV2] 과제 진행하기(Kotlin/Python)  (0) 2023.04.02
[프로그래머스>LV3] 외벽점검(Kotlin)  (0) 2023.04.01
[프로그래머스>LV1] 추억점수(Kotlin)  (0) 2023.03.31
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스 > LV2] 요격 시스템(Kotlin)
    • [프로그래머스>LV2] 연속된 부분 수열의 합 (Kotlin, Python)
    • [프로그래머스>LV2] 과제 진행하기(Kotlin/Python)
    • [프로그래머스>LV3] 외벽점검(Kotlin)
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바