ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [μ›”κ°„ μ½”λ”© μ±Œλ¦°μ§€] 풍선 ν„°λœ¨λ¦¬κΈ° - Level3
    곡뢀/μ•Œκ³ λ¦¬μ¦˜ 2022. 11. 25. 19:32
    728x90

    πŸ“λ¬Έμ œ μ„€λͺ… 

    일렬둜 λ‚˜μ—΄λœ n개의 풍선이 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  ν’μ„ μ—λŠ” μ„œλ‘œ λ‹€λ₯Έ μˆ«μžκ°€ 써져 μžˆμŠ΅λ‹ˆλ‹€. 당신은 λ‹€μŒ 과정을 λ°˜λ³΅ν•˜λ©΄μ„œ 풍선듀을 단 1개만 남을 λ•ŒκΉŒμ§€ 계속 ν„°νŠΈλ¦¬λ €κ³  ν•©λ‹ˆλ‹€.
    1. μž„μ˜μ˜ μΈμ ‘ν•œ λ‘ 풍선을 κ³ λ₯Έ λ’€, 두 풍선 쀑 ν•˜λ‚˜λ₯Ό ν„°νŠΈλ¦½λ‹ˆλ‹€.
    2. ν„°μ§„ ν’μ„ μœΌλ‘œ 인해 풍선듀 사이에 빈 곡간이 생겼닀면, 빈 곡간이 없도둝 풍선듀을 μ€‘μ•™μœΌλ‘œ λ°€μ°©μ‹œν‚΅λ‹ˆλ‹€.

    μ—¬κΈ°μ„œ 쑰건이 μžˆμŠ΅λ‹ˆλ‹€. μΈμ ‘ν•œ 두 풍선 μ€‘μ—μ„œ λ²ˆν˜Έκ°€ 더 μž‘μ€ 풍선을 ν„°νŠΈλ¦¬λŠ” ν–‰μœ„λŠ” μ΅œλŒ€ 1번만 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, μ–΄λ–€ μ‹œμ μ—μ„œ μΈμ ‘ν•œ 두 풍선 쀑 λ²ˆν˜Έκ°€ 더 μž‘μ€ 풍선을 ν„°νŠΈλ Έλ‹€λ©΄, κ·Έ μ΄ν›„μ—λŠ” μΈμ ‘ν•œ 두 풍선을 κ³ λ₯Έ λ’€ λ²ˆν˜Έκ°€ 더 큰 ν’μ„ λ§Œμ„ ν„°νŠΈλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

    당신은 μ–΄λ–€ 풍선이 μ΅œν›„κΉŒμ§€ 남을 수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μœ„μ— μ„œμˆ λœ μ‘°κ±΄λŒ€λ‘œ 풍선을 ν„°νŠΈλ¦¬λ‹€ 보면, μ–΄λ–€ 풍선은 μ΅œν›„κΉŒμ§€ 남을 μˆ˜λ„ μžˆμ§€λ§Œ, μ–΄λ–€ 풍선은 무슨 수λ₯Ό 쓰더라도 λ§ˆμ§€λ§‰κΉŒμ§€ λ‚¨κΈ°λŠ” 것이 λΆˆκ°€λŠ₯ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

    일렬둜 λ‚˜μ—΄λœ ν’μ„ λ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ aκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

     

    μœ„μ— μ„œμˆ λœ κ·œμΉ™λŒ€λ‘œ 풍선듀을 1개만 남을 λ•ŒκΉŒμ§€ ν„°νŠΈλ Έμ„ λ•Œ μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 것이 κ°€λŠ₯ν•œ ν’μ„ λ“€μ˜ 개수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

     


     

    μ œν•œ 사항
    • a의 κΈΈμ΄λŠ” 1 이상 1,000,000 μ΄ν•˜μž…λ‹ˆλ‹€.
      • a[i]λŠ” i+1 번째 풍선에 써진 숫자λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
      • a의 λͺ¨λ“  μˆ˜λŠ” -1,000,000,000 이상 1,000,000,000 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.
      • a의 λͺ¨λ“  μˆ˜λŠ” μ„œλ‘œ λ‹€λ¦…λ‹ˆλ‹€.

     

    μž…μΆœλ ₯ 예
    a result
    [9,-1,-5] 3
    [-16,27,65,-2,58,-92,-71,-68,-61,-33] 6

    μž…μΆœλ ₯ 예 μ„€λͺ…

    μž…μΆœλ ₯ 예 #1

    • 첫 번째 풍선(9κ°€ 써진 풍선)을 μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
      1. [9, -1, -5] μ—μ„œ -1, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -1이 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
      2. [9, -5] μ—μ„œ 9, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -5κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 μž‘μ€ 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
    • 두 번째 풍선(-1이 써진 풍선)을 μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
      1. [9, -1, -5] μ—μ„œ 9, -1이 써진 풍선을 κ³ λ₯Έ λ’€, 9κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
      2. [-1, -5] μ—μ„œ -1, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -5κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 μž‘μ€ 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
    • μ„Έ 번째 풍선(-5κ°€ 써진 풍선)을 μ΅œν›„κΉŒμ§€ λ‚¨κΈ°λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
      1. [9, -1, -5] μ—μ„œ 9, -1이 써진 풍선을 κ³ λ₯Έ λ’€, 9κ°€ 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
      2. [-1, -5] μ—μ„œ -1, -5κ°€ 써진 풍선을 κ³ λ₯Έ λ’€, -1이 써진 풍선(λ²ˆν˜Έκ°€ 더 큰 것)을 ν„°νŠΈλ¦½λ‹ˆλ‹€.
    • 3개의 풍선이 μ΅œν›„κΉŒμ§€ 남을 수 μžˆμœΌλ―€λ‘œ, 3을 return ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    μž…μΆœλ ₯ 예 #2

    • μ΅œν›„κΉŒμ§€ 남을 수 μžˆλŠ” 풍선은 -16, -92, -71, -68, -61, -33이 써진 ν’μ„ μœΌλ‘œ λͺ¨λ‘ 6κ°œμž…λ‹ˆλ‹€.

     

     πŸ”Ž 처음 μƒκ°ν•œ 아이디어  

    μ²˜μŒμ— 남길 수 μžˆλŠ” 경우의 수λ₯Ό λ‹€ ꡬ해야 ν•˜λ‚˜?라고 생각이 λ“€μ–΄ λ§‰λ§‰ν–ˆλ‹€.

    μ†μœΌλ‘œ 적어가며 경우의 수λ₯Ό λ‚˜λˆ„κ³  μžˆλ‹€κ°€ 이건 λ„μ €νžˆ μ•„λ‹Œ 것 κ°™μ•„μ„œ

    μ§ˆλ¬Έν•˜κΈ°μ—μ„œ λˆ„κ΅°κ°€ 남겨주신 접근법을 λ³΄κ²Œλ˜μ—ˆλ‹€.

    λκΉŒμ§€ λ‚¨κΈ°λ €λŠ” 풍선을 κΈ°μ€€μœΌλ‘œ 쒌, 우 κ΅¬κ°„μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν–ˆμ„ λ•Œ
    ν„°λœ¨λ¦¬λ €λŠ” ν’μ„ μ˜ 값은 두 μ΅œμ†Ÿκ°’λ³΄λ‹€ 크지 μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.
    ν•œ λ²ˆμ€ μž‘μ€ 풍선을 ν„°νŠΈλ¦΄ 수 있기 λ•Œλ¬Έμ— ν„°νŠΈλ¦¬λ €λŠ” 푸선이
    쒌, 우 μ΅œμ†Œκ°’ 쀑 ν•˜λ‚˜λ³΄λ‹€λŠ” 클 수 μžˆμ–΄λ„, λ‘˜ 보닀 컀버리면 남길 수 μ—†μŠ΅λ‹ˆλ‹€.
    Only one max = 큰 μˆ˜λŠ” ν•˜λ‚˜κΉŒμ§€λ§Œ ν—ˆμš©
    μ’Œμ—μ„œ 우둜 μ΅œμ†Ÿκ°’μ„ κ°±μ‹ ν•˜λ©° 배열에 λ„£κ³ , μš°μ—μ„œ 쒌둜 λ™μΌν•˜κ²Œ ν•΄ μ£Όκ³ 
    λ§ˆμ§€λ§‰μ— 두 μ΅œμ†Ÿκ°’λ³΄λ‹€ 크지 μ•Šλ‚˜ λ³΄λ©΄μ„œ ν™•μΈν•΄μ€λ‹ˆλ‹€.

    λΌλŠ” κΈ€μ—μ„œ 힌트λ₯Ό μ–»μ—ˆλ‹€.

    천재..!!

     

    λ°°μ—΄ 쀑 처음과 끝 풍선은 무쑰건 λκΉŒμ§€ 남길 수 μžˆλ‹€. 

    κ·Έλ ‡λ‹€λ©΄ κ·Έ 사이 값을 κ²€μ‚¬ν•΄μ•Όν•˜λŠ”λ°, 

    ν˜„μž¬ κ²€μ‚¬ν•˜λŠ” 사이값을 A라고 ν•˜κ² λ‹€. 

    그리고 쒌우 값을 각각 l_min, r_min값이라고 ν•˜κ² λ‹€.

    Aκ°€   l_min, r_min 보닀 큰 경우만 남길 수 μ—†λ‹€.

    μ™œλƒ? μΈμ ‘ν•œ 두 풍선 μ€‘μ—μ„œ λ²ˆν˜Έκ°€ 더 μž‘μ€ 풍선을 ν„°νŠΈλ¦¬λŠ” ν–‰μœ„λŠ” μ΅œλŒ€ 1번만 ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

     l_min,  A , r_min μ΄λ ‡κ²Œ 풍선이 μ‘΄μž¬ν•  λ•Œ

    l_min, r_minr_min 쀑 μ–΄λ–€ 값을 ν„°νŠΈλ €λ„ 무쑰건 Aλ₯Ό ν„°νŠΈλ €μ•Ό ν•˜λŠ” 상황이 μ˜¨λ‹€.

    κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Aλ₯Ό 남기렀면 Aκ°€ κ°€μ§„ 값이

    1. l_min < A < r_min
    2. r_min < A < l_min
    3. A < r_min , l_min

    이여야 남길 수 있으며 

    A > l_min, r_min 이면 λΆˆκ°€λŠ₯ν•˜λ‹€. 

     

     

     βœοΈ μž‘μ„±ν•œ μ½”λ“œ 

    package monthly_coding_challenge;
    
    public class ν’μ„ ν„°λœ¨λ¦¬κΈ° {
    
    
    		public int solution(int[] a) {
    			 int answer = 2;
    				int l_min = a[0];
    				int r_min = a[a.length-1];
    				
    				int x = 1, y = a.length-2;
    			   
    				for(int i =1;i<a.length-1;i++) {
    					
    					if(l_min > r_min) { // 큰값보닀 a[]값이 더 크면 a[] 값은 남길 수 μ—†μŒ 
    				
    						if(l_min > a[x]) {
    							answer++;
    							l_min = a[x];
    						}
    						x++;
    					}else {
    						
    						if(r_min>a[y]) {
    							answer++;
    							r_min = a[y];
    						}
    						y--;
    					}
    					
    					
    				}
    			   
    			  
    				
    				return answer;
    		}
    	
    
    }
    /*
     μ •ν™•μ„±  ν…ŒμŠ€νŠΈ
    ν…ŒμŠ€νŠΈ 1 〉	톡과 (0.02ms, 72.9MB)
    ν…ŒμŠ€νŠΈ 2 〉	톡과 (0.01ms, 72.5MB)
    ν…ŒμŠ€νŠΈ 3 〉	톡과 (0.04ms, 76.6MB)
    ν…ŒμŠ€νŠΈ 4 〉	톡과 (1.96ms, 83.5MB)
    ν…ŒμŠ€νŠΈ 5 〉	톡과 (4.15ms, 121MB)
    ν…ŒμŠ€νŠΈ 6 〉	톡과 (6.52ms, 118MB)
    ν…ŒμŠ€νŠΈ 7 〉	톡과 (8.56ms, 130MB)
    ν…ŒμŠ€νŠΈ 8 〉	톡과 (7.22ms, 138MB)
    ν…ŒμŠ€νŠΈ 9 〉	톡과 (4.86ms, 125MB)
    ν…ŒμŠ€νŠΈ 10 〉	톡과 (4.98ms, 128MB)
    ν…ŒμŠ€νŠΈ 11 〉	톡과 (9.68ms, 122MB)
    ν…ŒμŠ€νŠΈ 12 〉	톡과 (10.79ms, 139MB)
    ν…ŒμŠ€νŠΈ 13 〉	톡과 (9.35ms, 133MB)
    ν…ŒμŠ€νŠΈ 14 〉	톡과 (11.88ms, 129MB)
    ν…ŒμŠ€νŠΈ 15 〉	톡과 (8.74ms, 142MB)
    채점 κ²°κ³Ό
    μ •ν™•μ„±: 100.0
    합계: 100.0 / 100.0
    */

     

     πŸ– μ•Œκ²Œ 된 점 

    λ‹€λ₯Έ μ‚¬λžŒ 풀이 쀑 이마λ₯Ό 탁 치게 된 πŸ”₯πŸ”₯

       public int solution(int[] a) {
            int answer = 0;
            int min1 = Integer.MAX_VALUE;
            int min2 = Integer.MAX_VALUE;
            HashSet<Integer> hs = new HashSet<>();
            // int[][] dp=new int[a.length][2];
            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);
                // dp[i][0]=min1;
                // dp[a.length-1-i][1]=min2;
    
            }
            // for(int i=0;i<dp.length;i++){
            //     System.out.println(dp[i][0]+" "+dp[i][1]);
            // }
            return hs.size();
        }

     

     

     

     

     

     

    ν•˜λ“œ μ½”λ”©ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•˜μ§€ 말고
    κ·œμΉ™μ„ μ°Ύμ•„λ³΄μž.

     

     

     

     

     

    λŒ“κΈ€

Designed by Tistory.