코딩연습

(C#) 풍선 터트리기

Realuda72 2025. 5. 28. 21:06

코딩테스트 연습 - 풍선 터트리기 | 프로그래머스 스쿨

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풍선을 터트리는 문제

 

n번째 풍선을 남기고 싶으면 0~n-1까지의 풍선을 모두 터트리고 n+1~끝까지의 풍선을 모두 터트리면 된다.

[0, n)의 풍선을 모두 터트리다보면 [0, n)에서 최소값을 가지는 풍선만이 남을 것이다.

마찬가지로 (n, 끝)의 풍선을 모두 터트리면 (n, 끝)에서 최소값을 가지는 풍선만이 남을 것이다.

 

인접한 두 풍선 중 작은 풍선을 터트릴 기회는 최대 1번밖에 없으므로, n양쪽에 남은 풍선이 모두 n보다 작다면 n을 남길 수 없을 것이다.

 

처음에는 n번째 풍선의 왼쪽과 오른쪽에 남는 풍선을 일일이 구해서 했다.

for( 0 ~ a.Length)

    for(0 ~ n - 1), for(n+1 ~ a.Length)

-> O(n^2)

-> a의 크기가 최대 100만개이므로 n^2는 시간초과가 나왔다

 

그래서 a[i]에서 왼쪽값, 오른쪽값을 미리 구해놓는 방법으로 했다.

for(0 ~ a.Length)

    left값 구하기

for(0 ~ a.Length)

    right값 구하기

for(0 ~ a.Length)

    풍선이 터트릴 수 있는지 확인하기

-> O(n)

-> 통과

 

코드

using System;

public class Solution {
    public int solution(int[] a) {
        int answer = 2;
        // 어떤 풍선을 남기고싶으면 그 양옆을 다 터트리면 된다 n
        // -> 어떤 풍선의 왼쪽에 있는 모든 풍선 중 가장 작은 풍선 x
        // -> 어떤 풍선의 오른쪽에 있는 모든 풍선 중 가장 작은 풍선 y
        // x, y가 모두 n보다 작으면 불가능
        // x, y가 하나라도 n보다 크면 가능
        var left = new int[a.Length];
        var right = new int[a.Length];
        
        left[0] = int.MaxValue;
        for(var i = 1; i < a.Length; i++){
            left[i] = Math.Min(left[i - 1], a[i - 1]);
        }
        right[a.Length - 1] = int.MaxValue;
        for(var i = a.Length - 2; i >= 0; i--){
            right[i] = Math.Min(right[i + 1], a[i + 1]);
        }
       
        for(var i = 1; i < a.Length - 1; i++){
            // Console.WriteLine($"[{left[i]} {a[i]} {right[i]}]");
            if(a[i] < left[i] || a[i] < right[i]) answer++;
        }
        return answer;
    }
}

결과

 

'코딩연습' 카테고리의 다른 글

(javascript) 최적의 행렬 곱셈  (0) 2025.06.03
(javascript) 사칙연산  (0) 2025.06.01
(C#) 아이템 줍기  (0) 2025.05.28
(C#)순위  (0) 2025.05.23
(javascript) 추석 트래픽  (0) 2025.05.16