Level1. 체육복
문제설명 )
풀이Code )
더보기
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
int cnt = 0;
for (int i=0; i<lost.length; i++) {
for (int j=0; j<reserve.length; j++) {
if (lost[i] == reserve[j]) { // 여분의 체육복이 있지만 잃어버린 학생 제외하기
cnt++; // 체육복이 있는것이므로 cnt ++
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] == reserve[j] +1 || lost[i] == reserve[j] -1) {
cnt++; // 빌려줄수있는 학생있으면 cnt에 ++
reserve[j] = -1; // 빌려주고나면 빌려준 학생은 -1값으로 변경
break;
}
}
}
answer = n - lost.length + cnt; // 총 학생수 - 잃어버린 학생 + cnt
return answer;
}
}
풀이법 )
- 여분의 체육복이있지만 잃어버린 학생 먼저 제외시키기
- 잃어버린 학생에게 체육복 빌려줄수있는 학생있는지 cnt
- 총학생수 에서 잃어버린 학생을 제외시키고 cnt를 더해주기
2021.11.14 풀이
더보기
import java.util.*;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
int lostCnt = 0;
Arrays.sort(lost); // lost가 정렬안되서 들어올시 순서대로 제거를 못하니까 정렬해주기
ArrayList<Integer> list = new ArrayList<>();
for(int num : reserve) {
list.add(num);
}
for(int i=0; i<lost.length; i++) {
// 잃어버렸는데 여유분 갖고있는 학생을 우선 제거해준다.
if(list.contains(lost[i])) {
list.remove(Integer.valueOf(lost[i]));
lost[i] = 0;
}
}
for(int i=0; i<lost.length; i++) {
// 위에서 제거한 학생빼고 나머지 학생들중에서 찾는다
if(lost[i] != 0) {
if(list.contains(lost[i]-1)) { // 학생의 전번호가 여유분이 있는지 체크
list.remove(Integer.valueOf(lost[i]-1));
} else if (list.contains(lost[i]+1)) { // 학생의 뒷번호가 여유분이 있는지 체크
list.remove(Integer.valueOf(lost[i]+1));
} else {
lostCnt++; // 두가지 경우가 모두없으면 잃어버린 학생수 +
}
}
}
return n - lostCnt;
}
}
기존코드가 시간복잡도는 훨씬 빠른데.. 실패케이스가 나온다.
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] Level1. 2016년 (Java) (0) | 2021.01.02 |
---|---|
[Programmers] Level1. K번째 수 (Java) (0) | 2021.01.01 |
[Programmers] Level1. 완주하지 못한 선수 (Java) (0) | 2020.12.27 |
[Programmers] Level1. 모의고사 (Java) (0) | 2020.12.26 |
두 개 뽑아서 더하기 (0) | 2020.12.08 |