간단한 그리디 문제.
같은 알고리즘을 사용해서 파이썬, 자바 각각 풀어봤다.
def solution(n, lost, reserve):
# 여분도 없는데 잃어버림
lost_p = set(lost) - set(reserve)
# 여분 있는데 안잃어버림
rese_p = set(reserve) - set(lost)
for i in rese_p:
if i-1 in lost_p:
lost_p.remove(i-1)
elif i+1 in lost_p:
lost_p.remove(i+1)
return n-len(lost_p)
import java.util.Set;
import java.util.HashSet;
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
Set<Integer> lost_p = new HashSet<>();
Set<Integer> rese_p = new HashSet<>();
for (int i : lost) {
lost_p.add(i);
}
for (int i : reserve) {
if (lost_p.contains(i)) {
lost_p.remove(i);
} else {
rese_p.add(i);
}
}
for (int i : rese_p) {
if (lost_p.contains(i - 1)) {
lost_p.remove(i - 1);
} else if (lost_p.contains(i + 1)) {
lost_p.remove(i + 1);
}
}
return n - lost_p.size();
}
}
set 할당
lost_p
: 여분도 없는데 잃어버린 학생 리스트 (=빌려야 하는 학생들)
rese_p
: 여분도 있는데 잃어버리지 않은 학생 (=다른 학생에게 여분의 체육복을 빌려줄 수 있음)
최종적으로 빌릴 수 없는 학생들을 구하기
rese_p
앞 뒤로 lost_p
에 해당하는 학생이 있으면 lost_p
에서 해당 학생 삭제.
#파이썬에서는..
for i in rese_p:
if i-1 in lost_p:
lost_p.remove(i-1)
elif i+1 in lost_p:
lost_p.remove(i+1)
//자바에서는..
for (int i : rese_p) {
if (lost_p.contains(i - 1)) {
lost_p.remove(i - 1);
} else if (lost_p.contains(i + 1)) {
lost_p.remove(i + 1);
}
}
이 때 if else문을 통해 조건문 없이도 rese_p
학생이 자신의 앞 번호의 학생을 우선적으로 빌려줄 수 있음.
간단한 문제였지만.. 파이썬으로 푸니까 훨씬! 간단했다.
확실히 파이썬이 시간 제한이 있는 코딩테스트에서는 유리하겠다는 생각을 또 한 번 하게 해준 문제