코테/프로그래머스

[프로그래머스/Level3] 풍선 터뜨리기 (JAVA)

imname1am 2024. 3. 29. 23:56
반응형

📖 문제

 

프로그래머스

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

programmers.co.kr

 

 

 

💡  풀이 방식

a의 길이가 기니까 풍선 갯수(n)를 늘려가며 규칙성을 찾아보자..

 

- n이 1이면, 무조건 풍선이 하나 남으므로 1 반환

- n이 2면, 2가지(1번 풍선이 작고 2번 풍선이 큰 경우 / 1번 풍선이 크고 2번 풍선이 작은 경우)이므로 낮은 풍선 터트리는 기회를 사용하지 않고 2 반환

- n이 3이면, 가운데 풍선을 기준으로 4가지 경우의 수로 나눈다.

  ㄴ 가운데 풍선 기준, 왼쪽은 작고 오른쪽은 경우

  ㄴ 가운데 풍선 기준, 왼쪽은 크고 오른쪽은 작은 경우

  ㄴ 가운데 풍선 기준, 왼쪽은 작고 오른쪽도 작은 경우

  ㄴ 가운데 풍선 기준, 왼쪽은 크고 오른쪽도 경우

 

그러면 맨 왼쪽 풍선과 맨 오른쪽 풍선은 무조건 남을 수 있는 풍선이라는 걸 알 수 있다.

 

이를 통해 맨 왼쪽 풍선과 맨 오른쪽 풍선을 제외하고 반복문을 순회하면서

비교하려고 하는 풍선의 왼쪽 그룹의 최솟값과 오른쪽 그룹의 최솟값을 비교해

둘 다 작다면 해당 풍선은 건너뛰고 다음 풍선을 확인한다.

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.*;
 
class Solution {
    public int solution(int[] a) {
        int size = a.length;
        if(size == 1)   return 1;    // 풍선 개수가 1개면 1개만 남길 수 있음
        
        int[] leftMin = new int[size];  // 각 인덱스에서 왼쪽  원소의 최소값 저장
        int[] rightMin = new int[size]; // 각 인덱스에서 오른쪽 원소의 최대값 저장
        int l = a[0];   // 왼쪽 값 중 최소값
        int r = a[size -1]; // 오른쪽 값 중 최소값
        
        // i일 때 왼쪽 원소의 최소값 저장
        for(int i = 1 ; i < size -1 ; i++) {
            if(l > a[i]) // 왼쪽 끝+1의 요소가 left보다 작으면 남길 수 있음
                l = a[i];
            leftMin[i] = l;
        }
        
        // i일 때 오른쪽 원소의 최소값 저장
        for(int i = size -2 ; i > 0 ; i--) {
            if(r > a[i]) // 오른쪽 끝-1의 요소가 right보다 작으면 남길 수 있음
                r = a[i];
            rightMin[i] = r;
        }       
        
        int answer = 2// 최후까지 남기는 게 가능한 풍선들 개수 (풍선이 2개 이상이면 2개부터 시작)
        for(int i = 1 ; i <= size -2 ; i++) {
            if(a[i] > leftMin[i] && a[i] > rightMin[i]) continue; // 양쪽의 최솟값보다 크다면 continue
            answer++;
        }
        
        return answer;
    }
}
cs

 

 

 

➕ 다른 풀이 방식

HashSet을 활용한 풀이 !!!🙊🙊

import java.util.*;

class Solution {
    public int solution(int[] a) {
        int answer = 0;
        
        int min1 = Integer.MAX_VALUE;
        int min2 = Integer.MAX_VALUE;
        
        HashSet<Integer> hs = new HashSet<>();
        
        for(int i = 0 ; i < a.length ; i++){
            min1 = Math.min(min1, a[i]);
            min2 = Math.min(min2, a[a.length -1 -i]);
            
            hs.add(min1);
            hs.add(min2);
        }
        
        return hs.size();
    }
}

 


💦 어려웠던 점

- 규칙을 못 찾겠으면 역시 직접 그려보고 규칙을 찾는 수밖에 없는 것 같다,,

 

 

🧐 새로 알게 된 내용

- 다아아아아아...

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[프로그래머스]풍선 터트리기 - JAVA

[프로그래머스]풍선 터트리기 코딩테스트 연습 - 풍선 터트리기 | 프로그래머스 (programmers.co.kr) 코딩테스트 연습 - 풍선 터트리기 [-16,27,65,-2,58,-92,-71,-68,-61,-33] 6 programmers.co.kr 풀이 이 문제의 조건

moonsbeen.tistory.com

 

[Programmers] 풍선 터트리기 (Java)

1. 문제요약 코딩테스트 연습 - 풍선 터트리기 | 프로그래머스 스쿨 (programmers.co.kr) 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등

g-egg.tistory.com

 

[프로그래머스] 풍선 터트리기 Java 풀이

이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다. 틀리거나 잘못된 정보가 있을 수 있습니다. 댓글로 알려주시면 수정하도록 하겠습니다. 1. 문제 일렬로 나열된 n개의 풍선이 있습니다. 모

small-stap.tistory.com

 

[프로그래머스 level_3 / 월간 코드 챌린지 시즌 1] 풍선 터트리기 for JAVA

programmers.co.kr/learn/courses/30/lessons/68646 코딩테스트 연습 - 풍선 터트리기 [-16,27,65,-2,58,-92,-71,-68,-61,-33] 6 programmers.co.kr [문제 설명] 일렬로 나열된 n개의 풍선이 있습니다. 모든 풍선에는 서로 다른

tosuccess.tistory.com

 

 

 

친절한 설명..

 

[java] 프로그래머스 (풍선 터트리기) Level 3

Problem : https://programmers.co.kr/learn/courses/30/lessons/68646 코딩테스트 연습 - 풍선 터트리기 [-16,27,65,-2,58,-92,-71,-68,-61,-33] 6 programmers.co.kr Approach 월간 코드 챌린지 시즌1 문제였다. 문제의 조건은 다음과

gre-eny.tistory.com

 

반응형