[JAVA/프로그래머스] 탐욕법(Greedy)_체육복

👀 문제

https://programmers.co.kr/learn/courses/30/lessons/42862

👊 첫 번째 도전

1. 설계

  1. 학생 n을 가지는 배열을 생성, 1로 초기화한다.
  2. 도난당한 학생은 0의 값을 가지고, 여벌이 있는 학생은 2를 가진다.
  3. 학생들을 순회하며 도난당한 학생이 있으면 앞 뒤 학생이 여벌이 있을 경우 하나 준다.
  4. 최종적으로 옷을 가지고 있는 학생 수를 세서 리턴한다.

2. 구현

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
36
37
38
39
/**
 *
 * @author HEESOO
 *
 */
 class Solution {
     public int solution(int n, int[] lost, int[] reserve) {
         int answer = 0;
         int[] student=new int[n];
         for(int i=0;i<n;i++){
             student[i]=1;
         }
         for(int l:lost){
             student[l-1]--;
         }
         for(int r:reserve){
             student[r-1]++;
         }

         for(int i=0;i<n;i++){
             if(student[i]==0){
                 if(i-1>=0&&student[i-1]==2){
                     student[i]++;
                     student[i-1]--;                    
                 }
                 else if(i+1<n&&student[i+1]==2){
                     student[i]++;
                     student[i+1]--;
                 }
             }
         }
         for(int i=0;i<n;i++){
             if(student[i]==1||student[i]==2){
                 answer++;
             }
         }
         return answer;
     }
 }

3. 코드 설명

  • 학생 수(n)만큼의 크기를 가지는 배열을 생성, 1로 초기화한다. 옷이 없으면 0, 여벌이 있으면 2로 저장한다.
  • 배열을 순회하면서 현재 학생이 옷이 없을 경우, 앞뒤 학생이 여벌을 가지고 있는지 확인한다. 이때 인덱스가 배열의 범위를 벗어나지 않도록 체크한다. 옷이 있다면 준다.
  • 순회가 끝나면 배열을 다시 순회하며 옷이 있는 학생(여벌 포함)의 수를 세서 리턴한다.

4. 결과

실행결과 🤟 성공 🤟

👏 해결 완료!

쉬운 문제였지만 효율적으로 푼 것 같지는 않다.