문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한사항- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
힌트가 필요한가요? [코딩테스트 연습 힌트 모음집]으로 오세요! → 클릭
문제 고민
제한사항보면..
reserve 에 해당하는 인자만 빌려줄수있으며,
빌려줄때는 +=1 인덱스에만 빌려줄 수 있고,
만약 reserve == lost 같은 인덱스가 들어가있으면 해당 인덱스는 빌려줄 수가 없음.
수업을 들을 수 있는 최대값이 return 값이므로 n - 못듣는애 = return 이겠지
문제가 내가 파이썬 문법을 잘 몰라서
돌아간다는 점임
그래서 찾아봄
리스트에 특정 값이 있는지 체크하기
if item in list:
print('리스트에 값이 있습니다.')
else:
print('리스트에 값이 없습니다.')
리스트에 특정 값이 없는지 체크하기
if item not in list:
print('리스트에 값이 없습니다.')
else:
print('리스트에 값이 있습니다.')
값이 있는지 없는지를 체크할수가 있음
배열의 값 삭제
예제1
lst = [4, 3, 2, 1]
lst.remove(3)
print(lst)
[4, 2, 1]
list.remove(value)의 형태로 값을 입력해주면 리스트에서 값을 갖는 요소를 삭제합니다.
똑같은 값이 두 개 있다면 첫번째 요소만 삭제합니다. 그리고 한 번에 하나의 값만 입력할 수 있습니다.
그래서 이렇게 했는데 100퍼 정답이 아니란다.
def solution(n, lost, reserve):
answer = 0
cnt =0
for i in lost:
if i-1 in reserve:
reserve.remove(i-1)
elif i+1 in reserve:
reserve.remove(i+1)
else:
cnt +=1
answer = n - cnt
return answer
이유는.. 찾아보니 "중복되는 번호"는 없다 라는 조건을 신경썼어야 하는거였다.
중복요소는 제거해주고 시작해야한다는 것이다.
set 자료형은 중복을 허용하지 않는 집합자료형이다.
set의 장점은 객체끼리 집합 연산을 지원한다는 것인데, '-' 기호를 이용해 각 집합별로 차집합을 수행할 수 있다.
참고로 list자료형은 '-' 과 같은 차집합 연산이 되지 않는다고 한다.
제한 조건 중 중복을 허용하지 않는다는 lost와 reserve이기 때문에 set자료형을 쓴다고해서 lost 와 reserve 값에 변화는 없다.
(중복이 있는 list 끼리 차집합 연산수행 - Counter객체) - 찾아보기..
자세한설명은 다음 글을 봐주면된다.
나는 너무 모르는게 많다 여전히 ~ 하.........
https://rain-bow.tistory.com/30
아래의 코드가 젤 많은 좋아요를 받았다.
set을 안쓰고 리스트내에서 for문돌린것같은데
허허....뭐지.....
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)
[ 표현식 for 항목 in 리스트 or 튜플 if 조건문 ]
의 형태로 쓸 수 있다고 한다.
아마 저 코드는 lost 에 있지 않은 reserve 만 남기고
reserve에 있지 않는 lost 만 남기는
리스트 내포 for문인것같다,....
흠!
'✍️2023 > Algorithm' 카테고리의 다른 글
[BOJ/20053] 구현 기초문제 (0) | 2023.04.23 |
---|---|
[BOJ/2891]번 그리디 문제 (0) | 2023.04.23 |
[BOJ/1212] 구현 문제 (0) | 2023.04.21 |
구현 (1) | 2023.04.21 |
[BOJ/1439] 그리디 문제 (1) | 2023.04.20 |