문제풀이/프로그래머스

체육복 / 프로그래머스 연습문제 / programmers / level1 / Java

RUCKUS 2021. 5. 2. 10:00

 

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

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

이번문제는 푸는데 조금 애를 먹었다.

 

문제를 내가 완벽하게 이해하지 못한 부분도 있었고.... 어쨌든 내 생각중요한 요점은

 

1. 배열의 숫자는 오름차순 or 내림차순으로 주어지지 않는다.

2. 여벌의 체육복이 있지만 본인 체육복을 잃어버린 학생은 빌려줄 수 없기에 먼저 제거해줘야 한다.

   (사실 이 부분때문에 애를 먹었는데 1개의 for문 안에서 2가지를 동시에 처리하려다보니 문제가 생겼었다.)

 

하여 나의 코드는 !!??

 

package com.level01;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class gymClothes {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int n = 20;
		
		int [] reserve = {1,3,5,7,9,11,13,15,17,19};
		
		int [] lost = {2,4,7,8,10,11,14,16,17,20};
		
		solution(n, lost, reserve);

	}

	public static int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        int save = 0;
        // 여유분으로 되찾은 인원수

        for (int i = 0; i < reserve.length; i++) {
		// 여분있는 학생의 수만큼 반복하자.
        	
        	for (int j = 0; j < lost.length; j++) {
        		if(reserve[i] == lost[j]) {
        		// 만약에 읽어버린 학생의 번호와 여유분 학생의 번호가 같다면
        			reserve[i] = -100;
        			lost[j] = -100;
        			save++;
        			
        		} 
			}
        	
        }
        
        System.out.println("잃어버린 학생배열 : " + Arrays.toString(lost));
        System.out.println("여유분 학생 배열 : " + Arrays.toString(reserve));
        
        for (int i = 0; i < reserve.length; i++) {
        // 여유분 학생들은 빼주었으니 이제 체육복을 빌려줘보자
        	for (int j = 0; j < lost.length; j++) {
				if (reserve[i] == -100) {
				// 값이 -100이면 이미 나눠준거니까비교 할거 없이 건너 뛰자
					
				} else if (reserve[i] == lost[j] - 1 || reserve[i] == lost[j] + 1) {
					reserve[i] = -100;
        			lost[j] = -100;
        			save++;
				}
				
				
			}
        	
		}
        
        answer = n - lost.length + save;

        System.out.println("잃어버린 학생배열 : " + Arrays.toString(lost));
        System.out.println("여유분 학생 배열 : " + Arrays.toString(reserve));
        System.out.println("체육복 입은 학생 수 : " + answer);
        return answer;
    }
	
}

 

Arrays.sort() 메소드를 통해 배열을 오름차순으로 정렬해주고 난 후에 각각의 값을 비교하여 카운트를 하였다.

이게 greedy 알고리즘 즉, 각 단계에서 가장 최선의 선택을 하는 기법이라고 하는데...흠...

최대한 많이? 체육복을 빌려주는 개념이니까 이..개념?? 정도는 이해를 한 것같다.

반대로 최소 경로를 구하거나 하는 것도 greedy 알고리즘이 아닐가 싶다.

 

 

해도해도 어려운 알고리즘의 세계...벌써부터 level2가 까마득하다 ㅠ

 

화이팅!!

 


[깃허브]

https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level01/gymClothes.java

 

RUCKUSJERRY/practiceOfJava

Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.

github.com