본문 바로가기

ALGORITHM

[프로그래머스 Java] 체육복

 

코딩테스트 연습 - 체육복

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

programmers.co.kr

⏱소요 시간 - 25분

 

🔑해결 방법

 

두 번째 풀어서 빨리 풀었던 문제다.

 

체육복을 빌려주는 로직을 처리하기 전, 여벌이 있는데 도난당한 학생들을 먼저 처리해주기 위해 첫 번째 이중 for문을 실행하였다.

여기서 포인트는 lost[]와 reserve[]에서 겹치는 학생은 모두 두 배열에서 제외시켜야 한다는 점이다.

이 점을 간과해서 reserve[i] = -1을 빼먹고 첫 번째 제출해서 틀렸다ㅠㅠ (이미 도난당했으니 빌려줄 수도 없기 때문에 빼줘야 함)

 

그리고 0이 아닌 -1로 한 이유는 0으로 할 경우, 체육복을 빌려주는 로직에서

lost[0] == reserve[0] - 1 ----> reserve[0]이 1일 경우, lost[0]에 0이 들어있으면 안 되기 때문이다.

즉, 0번 학생은 없기 때문이다.

 

 

🔎소스 코드

 

package step1;

// 체육복
public class Ex05 {

	public static void main(String[] args) {
		
//		int n = 5;
//		int[] lost = { 2, 4 };
//		int[] reserve = { 1, 3, 5 };
		
//		int n = 5;
//		int[] lost = { 2, 4 };
//		int[] reserve = { 3 };
		
		int n = 3;
		int[] lost = { 3 };
		int[] reserve = { 1 };
		
		System.out.println(solution(n, lost, reserve));
		
	}
	
	public static int solution(int n, int[] lost, int[] reserve) {
		
		int answer = n - lost.length; // 무조건 수업을 들을 수 있는 학생 수
		
		// 여벌이 있는데 도난 당한 학생 구하기
		for(int i = 0; i < reserve.length; i++) {
			
			for(int j = 0; j < lost.length; j++) {
				
				if(reserve[i] == lost[j]) { // 여벌이 있는 학생이 도난을 당했다면
					lost[j] = -1; // 도난 목록에서 제외
					reserve[i] = -1; // # 빌려주는 학생에서도 제외
					answer++; // n - lost.length로 도난 당한 학생이 빠져있기 때문에 증가
					break;
				}
				
			}
		}
		
		// 체육복 빌려주기
		for(int i = 0; i < reserve.length; i++) {
			
			for(int j = 0; j < lost.length; j++) {
				
				if(lost[j] == reserve[i] + 1 || lost[j] == reserve[i] - 1) {
					lost[j] = -1;
					answer++;
					break;
				}
				
			}
			
		}
		
		return answer;
		
	}

}