그리디하게 풀기 (프로그래머스 체육복)

Halo·2025년 7월 16일
0

Algorithm

목록 보기
70/85

🔍 Problem

체육복


📃 Input&Output


🌁 문제 배경

가. 문제 설명
앞뒤사람에게 체육복을 주는 문제이다.

나. 접근 방법
그리디하게 접근하였다. 어떻게 그리디하냐면 일단 먼저 체육복을 줄 수 있는 사람을 찾고 왼쪽에 줄 수 있으면 주고 안되면 오른쪽에주고, 오른쪽에도 못주면 패스, 이런식 으로 해결하였다.

다. 문제 유형
그리디


📒 수도 코드

  1. 1로된 배열 만들기
  2. lost 참고해서 1씩 빼기
  3. reverse 참고해서 1씩 더하기
  4. 2인 친구들만 앞뒤 체육복 빌려주기 (자세한건 코드 주석 참고)

💻 Code

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int[] arr = new int[n+1];
        int cnt=0;
        
        
        for (int i=1; i<arr.length; i++){
            arr[i]=1;
        }
        
        for (int i : lost){                         // i : 체육복 잃어버린 친구들 번호
            arr[i]-=1;
        }
            
        for (int j : reserve) {                     // j : 체육복 여분 갖고 있는 친구들 번호
            arr[j]+=1;
        }
        
        for (int i=1; i<arr.length; i++){
            if(arr[i]==2){                          // 현재 줄 수 있는 친구면(arr[i]==2) 주고 빼기 아니면 패스
                if(i-1>=1 && arr[i-1]==0){               // 왼쪽 줄 수 있는지 : i-1>=1 and arr[i-1]==0 -> arr[i-1] +=1
                    arr[i-1]+=1;                    // 줬다면 arr[i]-=1   
                    arr[i]-=1;
                }
                else{                               // 주지 못했다면 오른쪽 체크
                    if(i+1<arr.length && arr[i+1]==0){   // 오른쪽 줄 수 있는지 : i+1 <arr.length and arr[i+1]==0 -> arr[i+1] +=1
                        arr[i+1]+=1;                // 줬다면 arr[i]-=1   
                        arr[i]-=1;
                    }                     
                }
            }
                // 줄수 없다면 pass
        }
        
        // arr[1~마지막]까지 0이 아닌 사람들 count 해서 return
        for (int i=1; i<arr.length; i++){
            if(arr[i] != 0){
                cnt++;
            }
        }
        
        return cnt;
    }
}


🤔 느낀점

걸린 시간은 40분으로 난이도 별 두개짜리 문제라고한다. 조금 더 시간 측정하는 것을 신경쓰고 노트에 잘 필기하는 방법을 고려해야겠다.

profile
새끼 고양이 키우고 싶다

0개의 댓글