체육복 도난, 여벌 체육복 지급 번호가 있기 때문에 앞 번호 학생이 뒷 번호 학생에게만 체육복을 빌려줄 수 있습니다.
4번 학생은 3번이나 5번에게
전체 학생 수 n, 체육복을 도난 당한 학생들의 번호가 담긴 배열 lost,
여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어집니다.
체육수업을 들을 수 있는 최댓값을 출력하는 문제입니다.
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2
테스트 (인텔리제이)
최종 출력되는 answer는 초기화를 다시하고 시작하겠습니다.
체육복을 빌리거나 원래 갖고 있던 학생은 체육 수업에 참여할 수 있습니다. 그 학생들의 수를 카운트하는 문제이기 때문에 일단 answer를 전체 학생 수에서 체육복을 잃어버린 학생 수를 빼면 잃어버리지 않은 학생 수가 나오게 됩니다.
그래서 answer = 전체 학생 수 - 체육복을 잃어버린 학생 수
이렇게 시작을 하고 먼저 체육복 여벌이 있으면서 도난도 다했을 가능성이 있기 때문에 그 학생 수를 카운트 하도록 합니다.
2중 for문을 사용하여 첫번째 for문은 체육복을 잃어버린 학생의 번호를 가져올 수 있게 순회하고 두번째 for문은 여분의 체육복이 있는 학생 수 만큼 순회하도록 합니다.
이제 if문으로 체육복을 잃어버린 학생과 여분 체육복이 있는 학생이 일치하는지 검사합니다. (일치하면 잃어버린 학생이 여분도 있는 학생이기 때문에 여분이 있는 학생이라도 다른 학생에게 체육복을 빌려줄 수 없는 상황이라 count만 하고 다음 실행 코드에는 여분이 없는 학생으로 인식되게 해야 합니다.)
일치하면 answer의 값을 1 증가하게 하고 체육복을 잃어버린 학생 번호를 갖고 있는 lost 배열과 여분 체육복이 있는 학생의 번호를 갖고 있는 reverse 배열의 해당 위치은 원소를 -1로 바꿔줍니다.
원소의 값이 -1이면 count 됐다는 의미이기 때문에 다음 코드에서 -1은 처리되지 않게 하면됩니다.
다음 코드는 여벌 체육복이 있는 학생에게 체육복을 잃어버린 학생들이 체육복을 빌릴 수 있다면 count 하도록 설계 했습니다. ( *조건으로 여분 체육복을 갖고 있는 학생은 본인의 앞 뒤 번호의 학생에게만 체육복을 빌려줄 수 있다는 조건이 있어 빌릴 수 있다는 가정에만 count 되도록 설계했습니다.)
이번에도 2중 for문을 사용하여 첫번째 for문은 lost의 크기만큼, 두번째 for문은 reverse의 크기만큼 순회하도록 합니다.
그 안에는 if문으로 lost의 원소에서 -1과 +1을 했을 때 reverse의 원소와 일치하면 answer의 값을 1 증가하게 하고 해당 lost 원소는 체육복이 생긴 것과 같고 reserve는 여분 체육복을 빌려줘 여분이 없는 상태가 되기 때문에 각각의 원소 값을 -1로 바꿔 다음 작업에서 처리되지 않게 했습니다.
import java.util.Arrays;
public class example {
/*
체육복 도난, 여벌 체육복 지급 번호가 있기 때문에 앞 번호 학생이 뒷 번호 학생에게만 체육복을 빌려줄 수 있다
4번 학생은 3번이나 5번에게
전체 학생 수 n, 체육복을 도난 당한 학생들의 번호가 담긴 배열 lost,
여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어집니다.
체육수업을 들을 수 있는 최댓값을 출력하는 문제입니다.
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
이때 이 학생은 체육복을 하나만 도난당했다고 가정하며,
남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2
*/
public static void main(String[] args) {
int n = 5; // 전체 학생 수
int[] lost = {2,4}; // 체육복을 잃어버린 학생 수
int[] reserve = {1,3,5}; // 여벌 체육복을 가져온 학생 수
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++) {
if (lost[i] -1 == reserve[j] || lost[i] + 1 == reserve[j]) {
answer++;
lost[i] = -1;
reserve[j] = -1;
break;
}
}
}
System.out.println(answer);
}
}
프로그래머스 코드
import java.util.Arrays;
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++) {
if (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]) {
answer++;
lost[i] = -1;
reserve[j] = -1;
break;
}
}
}
return answer;
}
}