프로그래머스 | 체육복 (Java)

mul·2023년 2월 7일
0

코딩테스트연습

목록 보기
13/56

🔒 문제

프로그래머스 Lv.1 체육복

🔑 해결

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

lost와 reserve 배열을 정렬한 다음 체육복이 있거나 빌릴 수 있는 학생들(체육복을 도난 당하지 않은 학생, 도난당했지만 예비로 들고 온 학생, 도난당했지만 체육복을 빌릴 수 있는 학생)을 answer에 더한다.

  1. reserve, lost 배열 정렬
  2. 전체에서 도난 당한 학생 수를 빼서(n - lost.length) 도난 당하지 않은 학생 수를 answer에 더한다.
  3. lost배열과 reserve배열에 둘다 있는 학생은 본인 체육복은 있지만 빌려줄 수 없다.
    3-1. 체육복이 있어 체육수업을 들을 수 있는 학생이므로 answer++
    3-2. 다른 학생에게 체육복을 빌릴 필요가 없으므로 lost[i]에 상관없는 값 -1 저장.
    3-3. 다른 학생에게 빌려줄 수 없으므로 reserve[i]에 상관없는 값 -1 저장.
    3-4. 이후의 for문을 돌 필요 없으므로 break
  4. 체육복을 앞뒤 번호 학생에게만 빌려줄 수 있다. (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j])
    4-1. 체육복을 빌렸다면 answer++
    4-2. 체육복을 빌려줬으므로 reserve[j]에 -1 저장
    4-3. 더이상의 for문을 돌 필요 없으므로 break

🔓 코드

import java.util.Arrays;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        
        Arrays.sort(reserve);
        Arrays.sort(lost);
        
        // 도난 당하지 않은 학생 수
        answer = n - lost.length;
        
        // 여벌 체육복을 가져왔지만 도난당한 학생 수
        // 다른 학생에게 체육복을 빌려줄 수 없음
        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++) {
				if (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]) {
					answer++;
					reserve[j] = -1;
					break;
				}
			}
		}
        
        return answer;
    }
}

0개의 댓글