input
학생수 / 체육복 없는 학생 index / 여별이 있는 학생 index
output
체육복있는 학생 총 합 (체육복은 index 앞 뒤로만 빌릴 수 있음)
리스트를 이용해 풀려고했지만 runtime error
심지어 문제 제대로 안읽어서 여벌이 있지만 도둑맞은 케이스 생각안함
나의 코드
def solution(n, lost, reserve): student = [] i = 0 while i < n: if i+1 in lost: student.append(0) elif i+1 in reserve: student.append(2) else: student.append(1) i += 1 answer = 0 if student[0] == 0 and student[1] == 2: student[0] = 1 student[1] = 1 if student[-1] == 0 and student[-2] == 2: student[-1] == 1 student[-2] == 1 for i in range(len(student)): if student[i] == 0: if student[i-1] == 2: answer += 1 student[i-1] = 1 elif student[i+1] == 2: answer += 1 student[i+1] = 1 else: answer += 1 return answer
모범코드1
def solution(n, lost, reserve): reserve_set = set(reserve)-set(lost) lost_set = set(lost)-set(reserve)ㅡ for reserve_person in reserve_set: if reserve_person-1 in lost_set: lost_set.remove(reserve_person-1) elif reserve_person+1 in lost_set: lost_set.remove(reserve_person+1) return n-len(lost_set)
모범코드2
def solution(n, lost, reserve): _reserve = [r for r in reserve if r not in lost] _lost = [l for l in lost if l not in reserve] for r in _reserve: f = r - 1 b = r + 1 if f in _lost: _lost.remove(f) elif b in _lost: _lost.remove(b) return n - len(_lost)
모범코드3
def solution(n, lost, reserve): answer = 0 for k in range n: i = k+1 if i not in lost: #안 잃어버린 학생 answer += 1 else: if i in reserve: #잃어버렸지만 여분도 있는 학생 answer += 1 reserve.remove(i) lost.remove(i) for i in lost: #잃어버리고 여분도 없어서 빌려야 하는 학생 if i-1 in reserve: answer += 1 reserve.remove(i-1) elif i+1 in reserve: answer +=1 reserve.remove(i+1) return answer
반성)
<모범코드1>
먼저 reserve와 lost에 중복으로 있는 index를 삭제하기 위해 차집합을 이용해 분리해준다.
그 다음 reserve set에 있는 인덱스 중 인덱스 +- 한 값이 lost set에 있으면 lost set에서 지워준다 (여벌을 줄 수 있기 때문에)
전체 학생수(n)에서 여벌을 더이상 받을 수 없는 학생수를 뺀다.
<모범코드2>
set 대신 for문을 통해 list로 reserve와 lost 중복을 없애준다.
<모범코드3>
내 풀이와 비슷하지만 여기서는 따로 list를 만들지 않고 input
값을 그대로 이용했다.