본문 바로가기

문제 풀이/Programmers

[프로그래머스] 체육복 (JAVA)

문제 출처 - Programmers

문제는 여기

 

코딩테스트 연습 - 체육복

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

programmers.co.kr


[풀이]

1. 잃어버린 사람 배열과 여분의 옷이 있는 사람 배열을 정렬해준다.

2. 여분의 옷이 있는 사람이 옷을 잃어버린 사람이 될 수 있으니 이 경우를 찾아 처리해준다.

3. 여분의 옷의 사람과 잃어버린 사람이 1 차이 이하로 나는 경우만 빌릴 수 있으므로 이 경우 처리를 해준다.

4. 결과를 출력한다.

[접근]

1. 배열을 순차적으로 탐색하면서 자신보다 1 작거나 1 큰 값이 있으면 처리해주면 되겠다고 생각하였다.

2. 배열이 정렬되어있다는 내용이 없어 Arrays.sort를 사용해 정렬해줬다.

3. 여분의 옷이 있는 사람이 옷을 잃어버린 경우가 있을 수 있으니 이를 먼저 처리해줬다.

[코드]

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = n - lost.length;
        
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        // 여벌이 있는 학생이 도난당한 경우
        for (int i = 0; i < lost.length; i++) {
            for (int j = 0; j < reserve.length; j++) {
                // 자기 자신이 포함되어있는지 체크
                if (lost[i] == reserve[j]) {
                    answer++; // 자신의 옷을 입으면 되니까 참여자 수 증가
                    lost[i] = -1;
                    reserve[j] = -1; 
                    break;
                }
            }
        }
        
        // 체육복 빌려주는 경우
        for (int i = 0; i < lost.length; i++) {
            for (int j = 0; j < reserve.length; j++) {
                // 잃어버린 사람꺼보다 1 작거나 1 큰거 가능하니까
                if ((lost[i] - 1 == reserve[j]) || (lost[i] + 1 == reserve[j])) {
                    answer++;
                    reserve[j] = -1; 
                    break;
                }
            }
        }
        return answer;
    }
}