programmers.co.kr/learn/courses/30/lessons/42862
1. boolean array 2개를 만들어서 하나는 유니폼이 있는 학생, 하나는 여유분이 있는 학생으로 나눴다.
2. 먼저 여유분이 있지만 도난당한 학생을 먼저 처리해주고, 이후엔 앞의 번호의 학생에게 우선 빌려주는 방식으로 처리하였다.
풀이 과정에서 11번이 안 되었는데 배열을 쓰는 과정에서 제일 끝 값에 대한 처리가 미흡했던 것으로 추측 된다.
예시의 테스트케이스를 이용하여 해결하였다.
11번이 되고나니 12번이 안 되었다. 12번은 여유분이 있지만 도난 당한 경우여서 그에 대한 거를 먼저 처리해 주니 잘 처리 되었다.
굳이 배열을 따로 만들지 않고 한번에도 처리 가능한듯 싶다.
set으로도 된다고도 한다.-> 나중에 도전!
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
answer = n-lost.length;
boolean []hasUniform = new boolean[n+1];
boolean []reserveCheckAll= new boolean[n+1];
Arrays.fill(hasUniform, true);
for (int i = 0; i < lost.length; i++) {
hasUniform[lost[i]] = false;
}
for (int i = 0; i < reserve.length; i++) {
reserveCheckAll[reserve[i]] = true;
if(!hasUniform[reserve[i]]&& reserveCheckAll[reserve[i]]) {
reserveCheckAll[reserve[i]]= false;
hasUniform[reserve[i]] = true;
answer++;
continue;
}
}
int cnt = 0;
for (int i = 0; i < lost.length; i++) {
int student = lost[i];
if(hasUniform[student]) continue;
int prevStudent = student-1;
int nextStudent = student+1;
if(nextStudent> 1 && reserveCheckAll[prevStudent]) {
reserveCheckAll[prevStudent]= false;
hasUniform[student] = true;
cnt++;
continue;
}
if(nextStudent<= n && reserveCheckAll[nextStudent]) {
reserveCheckAll[nextStudent]= false;
hasUniform[student] = true;
cnt++;
continue;
}
}
System.out.println(answer+cnt);
return answer+cnt;
}
public static void main(String[] args) {
Solution s = new Solution();
//11번 테스트케이스
int n = 9;
int[] lost = {2,4,7,8};
int[] reserve = {3,6,9};
//s.solution(n, lost, reserve);
//12번 테스트케이스
n = 5;
lost = new int[] {1,2,3};
reserve = new int []{2,3,4};
s.solution(n, lost, reserve);
}
}
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
[beakjoon] 14890 경사로 java (0) | 2021.10.19 |
---|---|
[프로그래머스]쿼드압축 후 개수 세기 (0) | 2021.03.12 |
[프로그래머스]불량사용자 (0) | 2021.03.11 |
[프로그래머스][1차] 프렌즈4블록도움말 (0) | 2021.03.07 |
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2021.03.04 |