기타/코딩테스트

[Python] 프로그래머스 - 체육복

lazy man 2023. 8. 21. 22:38

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. 배운점

비교 대상의 리스트가 분리되어 있거나, 앞의 순서 뒤의 순서를 고려해야 하거나.. 구현하는데 현타가 오는 경우 자료구조를 이용할 수 없을까 고민하는 것도 좋은 방법인 것 같다.