https://programmers.co.kr/learn/courses/30/lessons/42862
문제 설명
n명의 학생이 있습니다. lost에는 체육복을 잃어버린 학생의 번호가 있고, reserve에는 여분의 체육복을 가져온 학생의 번호가 있습니다. 해당 번호는 체격 순으로 부여한 번호이므로 +1 혹은 -1 번호의 학생에게만 체육복을 빌려줄 수 있습니다. 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
유의점
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
위의 경우를 생각해보며 알고리즘을 짜야합니다.
python 코드
절망편
이게 아니라는 걸 뇌는 알고 있었습니다.
손이 "아~ 기다려봐~ 되면 어쩌려고 그래 엉?? 눈으로 확인해보셔~"이러면서 본능적으로 막 치더라구요.
1
2
3
4
5
6
7
8
9
|
def solution(n, lost, reserve):
setLost = set(lost) - set(reserve)
setReserve = set(reserve) - set(lost)
answer = n-len(setLost)
for i in range(min(len(setLost),len(setReserve))):
if abs(list(setLost)[i] - list(setReserve)[i]) == 1:
answer+=1
return answer
|
cs |
뇌 : "아 그러게 내가 아니래도;;"
손 : "...머쓱..^^"
진짜 흑역사 하나 갱신해봅니다ㅋㅋㅋㅋㅋㅋㅋ
이번에도 반복문을 돌면서 인덱스를 벗어나는 경우가 생기더라구요.
lost 학생 수와 reserve 학생 수 더 작은 만큼만 돌면 되겠지!! 하면서 했네요.
abs의 경우 바로 앞 번호 학생이거나 바로 뒷 번호 학생일 때만 체육복을 빌릴 수 있으니 저렇게 작성해봤습니다.
허점이 많은 코드로군요...
결과는 합계: 41.7 / 100.0 반타작도 못했습니다.
희망편
절망편(이라고 쓰고 흑역사편)에서는 setLost의 i번째 인덱스와 setReserve의 i번째 인덱스를 비교해봤습니다.
이런 경우 [4]와 [1,3]인 경우에는 바로 퇴짜 맞게 됩니다.
그렇다면 근접한 숫자가 해당 집합에 포함되어 있는지 확인하는 방법으로 풀어봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def solution(n, lost, reserve):
setLost = set(lost) - set(reserve)
setReserve = set(reserve) - set(lost)
answer = n-len(setLost)
for i in setReserve:
left = i - 1
right = i + 1
if left in setLost:
answer+=1
elif right in setLost:
answer+=1
if answer > n:
answer = n
return answer
|
cs |
바로 이렇게 말이죠.
풀 때 1,2,3,4 이렇게 순서대로 있어서 왼쪽 오른쪽이라는 변수명을 사용했습니다...
정확히는 front와 back이 맞겠네요.
코드를 해석하면 간단해요.
앞 번호를 지정하는 변수(left) 뒷 번호를 지정하는 변수(right)가 serLost에 있는가만 판단하면 됩니다.
만약에 있다면 answer의 값을 늘려줍니다.
다만 끝도 없이 총인원수보다도 커질 가능성도 있기에 상한 조건을 걸어줍니다.
이렇게 풀면 100점으로 끝!!
주저리
다 풀고 나서 다른 분들의 풀이를 보니까 setLost.remove 이런 거 사용하시더라구요.
아니 저번에는 제거하지 못해서 안달 나더니 왜 이번에는 떠올리지 못했을까요??
허허허 시기적절하게 써보는 걸 목표로 삼겠습니다.
'알고리즘 > ps' 카테고리의 다른 글
백준 10610 python 문제 풀이 (0) | 2020.07.29 |
---|---|
[python] BOJ - 2217 로프 (0) | 2020.07.13 |
[python] 프로그래머스 - 완주하지 못한 선수 (0) | 2020.07.05 |
[BOJ] 백준 15829 Hashing (0) | 2020.07.02 |
BOJ 1152 (1) | 2020.06.30 |