Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

Far from it.

체육복(Greedy) 본문

문제풀기

체육복(Greedy)

두유콩 2019. 10. 10. 20:56

문제 설명

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

입출력 예

5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

입출력 예 설명

예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.

예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.

 

//

 

프로그래머스 레벨 1 문제 중에서 처음에 벽에 가로막힌듯한 기분을 들게 해주었던 문제이다.

 

혼자서 풀다가 포기하여 다른분의 코드를 보고 풀었습니다.

보면서 이해가 정말 잘 됐습니다.

https://blog.naver.com/yongyos/221486476348

 

//

 

import java.util.*;

class Solution {

	 public int solution(int n, int[] lost, int[] reserve) {
	     
		 int answer = n - lost.length; 
		 
		 List<Integer> lostList = new ArrayList<Integer>();
		 for(int i : lost) lostList.add(i);
		 
		 List<Integer> reserveList = new ArrayList<Integer>();
		 for(int i : reserve) reserveList.add(i);
		 
		 for (int i = 0; i < lostList.size(); i++) {
			 for (int j = 0; j < reserveList.size(); j++) {
				if(lostList.get(i)==reserveList.get(j)){
					lostList.remove(i);
					reserveList.remove(j);
					i--;
					answer++;
					break;
				}
			}
		}
		 
		 for (int i = 0; i < lostList.size(); i++) {
			int lostNum = lostList.get(i);
			for (int j = 0; j < reserveList.size(); j++) {
				int reserveNum = reserveList.get(j);
				if(lostNum == reserveNum-1 || lostNum == reserveNum+1) {
					reserveList.remove(j);
					answer++;
					break;
				}
			}
		}
		 
		 return answer;
	    
	 }
	
}

먼저 전체 학생 수에서 잃어버린 학생의 수를 뺐다. 

 

그리고 잃어버린 학생의 배열과 여분을 가지고 있는 학생의 배열을 ArrayList에 담았다.

 

다음에는 여분의 체육복을 가지고 있지만 체육복을 잃어버린 학생들의 목록에 있는 학생들을 제거하기 위하여

 

이중 for문을 사용하여 두 리스트에서 모두 제거하였다. (그리고 answer을 증가시켜준다)

 

그 이유는 여분의 체육복이 있기 때문에 잃어버렸다 하더라도 수업을 들을 수 있기 때문이다.

 

 

다음으로는 잃어버린 학생의 번호 앞 뒤에 여분이 있는 학생의 번호가 있는지 확인해야 한다.

 

바깥 for문에서는 잃어버린 학생의 번호를 정하고

 

안쪽 for문에서는 여분이 있는 학생의 번호를 정하고

 

만약 그 학생의 번호가 잃어버린 학생의 번호의 -1이거나 +1이라면 

 

여분 학생 리스트에서 그 학생을 제거하고 answer을 증가시켜준다. (체육복을 빌려주어서 수업을 들을 수 있는 학생의 수가 증가 하였기 때문에)

 

그리고 그 학생은 체육복을 빌렸기 때문에 break로 안쪽 for문을 종료

 

//

 

내가 따로 코드를 짜봐야겠다.

 

 

 

'문제풀기' 카테고리의 다른 글

가운데 글자 가져오기  (0) 2019.10.13
2016  (0) 2019.10.12
같은 숫자는 싫어  (0) 2019.10.09
문자열 내 마음대로 정리하기  (0) 2019.10.09
시저 암호  (0) 2019.09.22