728x90
문제가 이렇게 나왔다
우습게도 이것도 예전에 풀었던 문제였다.
function solution(n, lost, reserve) {
var arr = []; //빌려줄 수 있으면 true, 아니면 false
for(let i=1;i<=n;i++){
arr.push(1) //체육복 1개줌
if(reserve.includes(i)){ //체육복 2개가져왔으면 1개 추가해줌
arr[i-1]++;
}
if(lost.includes(i)){ //체육복 없으면 1개 깜
arr[i-1]--;
}
}
for(let i=0;i<n;i++){
if(arr[i] == 0){
if(arr[i-1]==2){
arr[i-1]--
arr[i]++;
}
else if(arr[i+1]==2){
arr[i+1]--;
arr[i]++;
}
}
}
let cnt=0;
for(let i=0;i<n;i++){
if(arr[i]>0){
cnt++;
}
}
return cnt;
}
일단 기본적인 방식은 전체 학생의 수만큼 반복하면서 각 배열의 값에 따라 정답 배열의 값을 더하거나 빼는 것이다.
def solution(n, lost, reserve):
u = [1]*(n+2)
for i in reserve:
u[i]+=1
for i in lost:
u[i]-=1
for i in range(1,n+1):
if(u[i-1] == 0 and u[i]==2):
u[i-1:i+1] = [1,1]
elif u[i] == 2 and u[i+1] == 0 :
u[i:i+2] = [1,1]
print([x for x in u[1:-1] if x>0])
return len([x for x in u[1:-1] if x>0])
기본적인 로직은 동일하나, 슬라이싱을 이용하여 조금 더 코드가 간결해졌다.
def solution(n, lost, reserve):
for i in reserve :
if i in lost :
reserve.remove(i)
lost.remove(i)
for i in sorted(reserve) :
if i-1 in lost or i+1 in lost :
try:
lost.remove(i-1)
except:
lost.remove(i+1)
처음에 푼 코드이다.
이것도 정상적으로 문제는 풀리지만
list에 대한 remove의 수행시간이 O(n)만큼 걸리기 때문에 비효율적이라 위의 코드로 변경했다.
728x90
'알고리즘' 카테고리의 다른 글
완주하지 못한 선수 javascript와 python의 비교 (0) | 2021.10.26 |
---|---|
Sherlock and the Valid String (0) | 2020.09.28 |
Alternating Characters javascript로 풀기 (0) | 2020.09.28 |
Strings: Making Anagrams javascript로 풀기 (0) | 2020.09.28 |
Mark and Toys javascript로 풀기 (0) | 2020.08.04 |