1. 체육복
URL : https://programmers.co.kr/learn/courses/30/lessons/42862
1.1 문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
1.2 제한사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
1.3 Solution
1
2
3
a = range(1, n+1)
a = list(a)
nolost = list(set(a) - set(lost))
- 주어진 학생수 n을 가지고 리스트 a를 생성
- a에서 잃어버린 학생 lost를 제외시켜 잃어버리지 않은 학생리스트 nolost를 생성
1
2
3
4
5
for i in lost:
if i in reserve:
nolost.append(i)
nolost = list(set(nolost))
nolost
1
[1, 3, 5]
- 여벌의 체육복을 가져오고, 1개를 도난당해 실제로 그냥 아무런 영향없이 체육수업을 들을수 있는 아이들을 잃어버리지 않은 학생(nolost)
1
2
posi = list(set(reserve) - set(lost))
posi
1
[1, 5]
- 여벌의 체육복을 가져오고, 잃어버리지 않은 학생들인 실제로 빌려줄수있는 학생 리스트 posi를 생성
1
2
reallost = list(set(lost) - set(reserve))
reallost
1
[2, 4]
- 체육복을 도난당했고, 여벌을 가져오지 않은 학생, 즉 진짜로 도난 당한 학생 리스트 reallost를 생성
1
2
3
4
5
6
7
8
for i in posi:
if i - 1 in reallost:
nolost.append(i)
nolost.append(i - 1)
elif i + 1 in reallost:
nolost.append(i)
nolost.append(i + 1)
len(list(set(nolost)))
1
5
- 빌려줄수 있는 학생들을 for문을 돌려 잃어버린 학생이 앞에 있거나 뒤에있으면 빌려주는 조건을 생성함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def solution(n, lost, reserve):
# 인원수를 리스트화
a = range(1, n+1)
a = list(a)
# 체육복 안잃어 버린애
nolost = list(set(a) - set(lost))
# 잃어버렸지만 2개 가져와서 괜찮은애를 안잃어버린애에 넣음
for i in lost:
if i in reserve:
nolost.append(i)
nolost = list(set(nolost))
# 실제로 빌려줄수 있는애
posi = list(set(reserve) - set(lost))
# 진짜 잃어버린애
reallost = list(set(lost) - set(reserve))
if len(posi) == 0:
return len(nolost)
# 빌려주기
for i in posi:
if i - 1 in reallost:
nolost.append(i)
nolost.append(i - 1)
elif i + 1 in reallost:
nolost.append(i)
nolost.append(i + 1)
return len(list(set(nolost)))
- 위의 내용을 함수로 작성
1
2
3
4
n = 7
lost =[2,3,4]
reserve = [1,2,3,6]
solution(n, lost, reserve)
1
6
1
2
3
4
n = 5
lost = [2, 3, 4]
reserve = [1, 3, 5]
solution(n, lost, reserve)
1
5
- 결과