코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = n;
boolean[] nohave = new boolean[n+1];
boolean[] borrow = new boolean[n+1];
for(int i=0; i<lost.length; i++){
nohave[lost[i]] = true; //잃어버린 학생 true 로 체크
answer--;
}
for(int i=0; i<reserve.length; i++){
borrow[reserve[i]] = true; //빌려줄 수 있는 학생 true 로 체크
}
for(int i=0; i<lost.length; i++){
int num = lost[i];
if(nohave[num] && borrow[num]){
borrow[num] = nohave[num] = false;
answer++;
continue;
}
if(nohave[num] && !borrow[num]){
if(num-1>=1 && borrow[num-1] && !nohave[num-1]){
borrow[num-1] = nohave[num] = false;
answer++;
continue;
}
if(num+1<=n && borrow[num+1] && !nohave[num+1]){
borrow[num+1] = nohave[num] = false;
answer++;
continue;
}
}
}
return answer;
}
}
1. 체육복을 잃어버려 가지고 있지 않은 학생 = nohave[] 배열에 true 로 표시
여분 체육복이 있어 빌려줄 수 있는 학생 = borrow[] 배열에 true 로 표시
2. 초기 answer값을 n으로 설정하고, 체육복 잃어버린 학생 수만큼 뺀 상태로 탐색 시작!
3. 체육복을 잃어버린 학생을 기준으로 탐색한다 == lost[] 배열로 탐색
1) 체육복을 잃어버렸고 && 여분 체육복이 있다면 - 여분 체육복을 자신이 입어야 하기 때문에 answer++
2) 체육복을 잃어버렸고 && 여분 체육복이 없다면
2-1) 왼쪽 학생(num-1)이 여분 체육복이 있고 && 체육복을 잃어버리지 않았다면 - answer++
2-2) 오른쪽 학생(num+1)이 여분 체육복이 있고 && 체육복을 잃어버리지 않았다면 - answer++
'1d-1c > Programmers' 카테고리의 다른 글
Level2_카카오프렌즈 컬러링북 (JAVA) (0) | 2020.11.05 |
---|---|
Level2_기능개발 (C++) (JAVA) (0) | 2020.11.05 |
Level1_모의고사 (JAVA) (0) | 2020.11.02 |
Level1_예산 (JAVA) (0) | 2020.11.02 |
Level1_두 개 뽑아서 더하기 (JAVA) (0) | 2020.10.31 |