코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
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;
}
}
'ALGORITHM' 카테고리의 다른 글
[프로그래머스 Java] 2016년 (0) | 2021.01.09 |
---|---|
[프로그래머스 Java] K번째 수 (0) | 2021.01.09 |
[프로그래머스 Java] 모의고사 (0) | 2021.01.08 |
[프로그래머스 Java] 완주하지 못한 선수 (0) | 2021.01.08 |
[프로그래머스 Java] 두 개 뽑아서 더하기 (0) | 2021.01.08 |