1. 문제정보
https://school.programmers.co.kr/learn/courses/30/lessons/42862
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 해결과정
우선 신경쓰였던 부분은 체육복을 도난 당한 학생이 앞에 친구에게 체육복을 빌릴 때와 뒤에 있는 친구에게 체육을 빌릴 때의 결과가 차이가 있을 수 있었다. 따라서 앞에 친구를 먼저 확인하고 뒤에 친구를 확인하는 순서와, 뒤에 친구를 확인하고 앞에 친구에게 확인하는 순서로 각각 값을 구한 후 더 작은 값을 결과로 내려고했다. 하지만 별도의 리스트를 비교하면서 구현하는데 어려움이 느껴졌고 자료구조(스택, 큐)와 같은 방법으로 해결이 가능할까라는 고민하다가 스택에서 힌트를 얻어 구현할 수 있었다.
우선 도난당한 학생(-1)과 여유분이 있는 학생(1)을 하나의 리스트로 표현한 후 스택처럼 쌓아가면서 0이 되는지 비교하여 구현하였다.
3. 소스코드
def solution(n, lost, reserve):
sum_list = []
for i in range(n):
# 여벌의 체육복을 가져왔으나 도난당한 학생 0으로 저장
if i+1 in lost and i+1 in reserve:
sum_list.append(0)
# 체육복을 도난당한 학생 -1로 저장
elif i+1 in lost:
sum_list.append(-1)
# 여벌의 체육복을 가져온 학생 1로 저장
elif i+1 in reserve:
sum_list.append(1)
else:
sum_list.append(0)
for i in range(1, n):
if sum_list[i-1] + sum_list[i] == 0:
sum_list[i-1] = 0
sum_list[i] = 0
return n - sum_list.count(-1)
4. 배운점
비교 대상의 리스트가 분리되어 있거나, 앞의 순서 뒤의 순서를 고려해야 하거나.. 구현하는데 현타가 오는 경우 자료구조를 이용할 수 없을까 고민하는 것도 좋은 방법인 것 같다.
'기타 > 코딩테스트' 카테고리의 다른 글
[Python] 프로그래머스 - 큰 수 만들기 (0) | 2023.08.22 |
---|---|
[Python] 프로그래머스 - 조이스틱(미해결) (0) | 2023.08.22 |
[Python] 프로그래머스 - 네트워크 (1) | 2023.08.21 |
[Python]프로그래머스 - 게임 맵 최단거리 (0) | 2023.08.21 |
[Python] 프로그래머스 - 타겟 넘버 (0) | 2023.08.21 |