def solution(n, lost, reverse):
result = 0
# 도난을 당한 학생 리스트
lost_list = [-99 for _ in range(n)]
for i in lost:
lost_list[i - 1] = i
# 여벌을 가져온 학생 리스트
reverse_list = [0 for _ in range(n)]
for i in reverse:
reverse_list[i - 1] = i
# 여벌을 가져온 학생이 도난 당했을 경우
for i in reverse_list:
if i in lost:
reverse_list[i - 1] = 0
lost_list[i - 1] = -99
for i in reverse_list:
if i > 0:
data = [-1, 1]
for j in data:
if i + j in lost_list:
lost_list[i + j - 1] = -99
break
result = lost_list.count(-99)
return result
n = int(input())
lost = list(map(int, input().split()))
reverse = list(map(int, input().split()))
print(solution(n, lost, reverse))
문제의 조건을 파악할 때
1. 여벌을 가져온 학생은 좌 우 학생에게 1벌을 빌려줄 수 있음.
2. 여벌을 가져온 학생이 도난당했을 경우도 있음
3. 여벌을 가져온 학생을 통해 최대한의 학생이(그리디) 체육복을 입을 수 있게 하라
도난/여벌 학생 리스트를 만들어 여벌 학생의 좌우를 탐색한다.
좌 우에 한 곳이라도 도난당한 학생이 있을 경우 체육복을 건내주고, 순서 마무리
마지막 카운트를 세 주면 최대 값이 나옴.
다른 사람의 코드
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]
print(_reserve)
print(_lost)
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)
n = int(input())
lost = list(map(int, input().split()))
reverse = list(map(int, input().split()))
print(solution(n, lost, reverse))
front와 back을 지정하여 lost 리스트에서 하나씩 remove를 해주었다.
간결하고 깔끔한 코드가 아닐 수 없다.
나는 사실 반복문에서 특정 리스트의 원소를 remove하는 것을 별로 좋아하지 않는다.
반복 중에 리스트의 요소에 변동이 생기게 되면 인덱스 범위를 넘어서거나 반복에 문제가 생길 때가 많았기 떄문이다
하지만 이번 문제 케이스의 경우에는 반복문에서 lost의 인덱스를 통해 어떤 분기가 결정되는게 아니므로 적합하게 사용할 수 있는 것이였다. 이런 다양한 문제를 많이 풀어봐야겠다.
'코딩 테스트 (Coding Test)' 카테고리의 다른 글
[프로그래머스] 햄버거 만들기 (0) | 2023.01.06 |
---|---|
[프로그래머스] 푸드 파이트 대회 (0) | 2023.01.05 |
[프로그래머스] 과일 장수 (0) | 2023.01.05 |
[프로그래머스] 기사단원의 무기 (0) | 2023.01.05 |
[프로그래머스] 그리디 조이스틱 파이썬 문제풀이 (0) | 2021.12.24 |