ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [그리디] 문제 이름 : 체육복
    Algorithm/Programmers 2021. 6. 28. 12:10

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

     

    1. 사용 알고리즘

    그리디

     

    2. 문제 해결 아이디어 

    체육복을 가진 학생의 수가 최대가 되기 위해서는 체육복을 도난 당한 학생의 앞뒤 학생이 여별 체육복이 있을 때 앞의 학생의 여벌 체육복을 빌리도록 해야한다. 

     

    3. 코드

    구현방식)

    1. lost[]와 reserve[]를 전체 학생의 배열 stu[]에 적용시켜 하나의 배열로 합쳐서 처리하도록 함 --> lost[]와 reserve[] 각각을 탐색하지 않아도 됨, 여벌 체육복을 가져온 학생이 도난당한 경우에 대해서도 한번에 처리 가능함

    2.  반환 값 answer(체육 수업을 들을 수 있는 학생 수)를 전체 학생 수의 값 n으로 초기 설정함 --> 0으로 초기화해서 증가시키는 것보다 감소시키는 경우가 코드가 더 간결함

    //조건 : 주어진 배열들이 정렬되어 있지 않다
    
    class Solution {
        public int solution(int n, int[] lost, int[] reserve) {
            //lost: 잃어버린 학생 번호 배열, reserve: 여벌 옷 가지고 있는 학생 번호 배열 
            
            //lost와 reserve를 합쳐서 하나의 배열로 생각하기!
            int stu[] = new int[n];
            int answer = n; //전체 학생 수로 설정해두고 감소시키기 -> 증가시키는 경우보다 코드가 적어짐 
            
            for(int i : lost)
                stu[i-1]--;
            for(int j : reserve)
                stu[j-1]++;
                
            //그리디 문제인 이유 : 앞뒤 사람 모두 여유복을 가지고 있을 때, 앞 사람의 것을 빌려야 최대가 나옴
            for(int k = 0; k < stu.length; k++){
                if(stu[k] == -1){ //체육복을 도난당한 학생의 경우
                    if(k-1 >= 0 && stu[k-1] == 1){ //앞 사람 먼저 확인  
                        stu[k]++;
                        stu[k-1]--;
                    }
                    else if(k+1 < stu.length && stu[k+1] == 1){
                        stu[k]++;
                        stu[k+1]--;
                    }
                    else answer--; //체육수업을 듣지 못하는 학생 
                }
            }
            return answer;
        }
    }

     

    추가 개념 정리)

    *자바의 for문에서 for(:) 의 기능

    for(Object:List) -> List에서 차례대로 원소를 꺼내서 Object에 저장을 하겠다는 의미

    class Main{
    	public static void main(String args[]){
        	int num[] = {1,2,3};
            
            for(int i : num)
            	System.out.println(i);
                
            //이 코드랑 동일한 의미!
            for(int i = 0; i < num.length; i++)
            	System.out.println(num[i]);
        }
    }
    
    /* 
    출력 결과 
    1
    2
    3
    */

     

     

    댓글

Designed by Tistory.