[프로그래머스] 체육복 (파이썬)

철웅·2022년 11월 23일
0

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42862

  1. 먼저 인원수(n)만큼 리스트를 0으로 초기화
  2. lost의 경우 -1로 표기, reserve일 경우 1을 더해준다.
    -> lost, reserve 둘 다 해당할 경우 0으로 표기해야 하기 때문
  3. 체육복을 빌려줬다면 1 -> 0, 체육복을 받았다면 -1 -> 0으로 표기
  4. 전부 돌면서 가능한 사람한테만 체육복을 빌려준 후 리스트에서 1과 0의 개수를 센다.

💻 Code

def solution(n, lost, reserve):
    
    li = [0] * n
    for i in lost:
        li[i-1] = -1
    for i in reserve:
        li[i-1] = li[i-1]+1
    
    for i in range(len(li)):
        if(li[i] == -1):
            if(i == 0 and li[i+1] == 1):    # 첫번째 사람이 체육복이 없는데 그 다음사람이 빌려줄 수 있는 경우
                li[i+1] = 0
                li[i] = 0
            elif(i == n-1 and li[i-1] == 1): # 마지막 사람이 체육복이 없는데 그 이전 사람이 빌려줄 수 있는 경우
                li[i-1] = 0
                li[i] = 0
            elif(i != 0 and i != n-1):      # 처음 마지막 x, 중간사람
                if(li[i-1] == 0 and li[i+1] == 0):
                    continue        # 왼쪽 오른쪽 둘 다 못 빌려주면 그냥 넘어간다
                elif(li[i-1] == 1 and li[i+1] == 1):  # 왼쪽 오른쪽 둘 다 빌려줄 수 있다면 왼쪽 사람거를 우선으로 받는다
                    li[i-1] = 0
                    li[i] = 0
                elif(li[i-1] == 1): # 왼쪽만 빌려줄 수 있는 경우
                    li[i-1] = 0
                    li[i] = 0
                elif(li[i+1] == 1): # 오른쪽만 빌려 줄 수 있는 경우
                    li[i+1] = 0
                    li[i] = 0
    answer = 0
    for stu in li:
        if(stu == 0 or stu == 1):
            answer += 1

    return answer

보기만 해도 노가다를 했다는게 보인다. 바로 모범답안을 보도록 하자

📌 다른 사람의 풀이

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)

0개의 댓글