프로그래머스 | 체육복 [파이썬 python]

2023. 5. 8. 17:10·Algorithm/프로그래머스
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드

def solution(n, lost, reserve):
    # 정렬
    lost.sort()
    reserve.sort()
	
    # lost, reserve에 공통으로 있는 요소 제거
    for i in reserve[:]:
        if i in lost:
            reserve.remove(i)
            lost.remove(i)
	
    # 체육복 빌려주기(나의 앞 번호부터 확인)
    for i in reserve:
        if i-1 in lost:
            lost.remove(i-1)
        elif i+1 in lost:
            lost.remove(i+1)
    
    return n-len(lost)

가장 먼저, lost, reserve를 오름차순 정렬 해준다.

 

예를 들어, n = 5, lost = [2, 4], reserve = [3, 1] 일 때를 생각해 보자.

1번이 2번에게 체육복을 빌려주고, 3번이 4번에게 체육복을 빌려주면 모두가 체육수업을 들을 수 있을 것이다.

하지만, lost, reserve를 정렬하지 않고 체육복을 빌려준다고 하면 결과가 어떻게 될까? (n = 5, lost = [2, 4], reserve = [3, 1])

  • i = 3이면
    • i - 1 = 2, lost에 존재하므로 lost에서 2 제거
    • lost = [4]
  • i=1이면
    • i - 1 = 0, lost에 존재하지 않음
    • i + 1 = 2, lost에 존재하지 않음
    • lost = [4]

정렬하지 않으면, n - len(lost) = 5 - 1 = 4명이 체육복을 입을 수 있다는 결과가 도출된다.

 

lost, reserve를 정렬하고 다시 과정을 진행해 보면 다음과 같다. (n = 5, lost = [2, 4], reserve = [1, 3])

  • i=1이면
    • i - 1 = 0, lost에 존재하지 않음
    • i + 1 = 2, lost에 존재하므로 lost에서 2 제거
    • lost = [4]
  • i = 3이면
    • i - 1 = 2, lost에 존재하지 않음
    • i + 1 = 4, lost에 존재하므로 lost에서 4 제거
    • lost = [ ]

정렬하면, n - len(lost) = 5 - 0 = 5명이 체육복을 입을 수 있다는 결과가 도출된다.

 

따라서, 체육복을 빌려주는 과정을 진행하기 전에 lost와 reserve를 정렬하는 과정이 필요하다.

 

lost와 reserve를 정렬한 뒤에는 두 배열에 공통으로 존재하는 요소를 각 배열에서 제거한다.

문제에서 '여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.'라고 명시하였기 때문이다.

 

여기까지의 과정을 모두 마무리했으면 lost, reserve 배열의 요소들을 비교하여 체육복을 빌려주는 작업을 진행한다.

나는 reserve를 기준으로 for문을 작성하였다.

만약, 1번 학생(= i-1)이 체육복이 없으면 1번 학생은 0번은 없으므로 2번 학생(= i)에게만 체육복을 받을 수 있다.

그러므로 reserve의 요소 i를 기준으로 왼쪽인 i-1부터 lost에 존재하는지 확인하고, i-1이 없으면 i+1을 확인하도록 하였다.

i-1 또는 i+1이 lost에 존재하면 lost에서 해당 값을 제거함으로써 체육복을 빌려준 것으로 한다.

이때 둘 다 if문으로 작성하면 3번 학생이 2번 4번 모두에게 빌려주는 사태가 발생하게 된다.

한 명에게만 빌려줄 수 있으므로 if - elif로 작성하여 하나의 조건에 대해서만 작업을 진행할 수 있도록 해야 한다.

 

최종적으로 n명의 학생에서 체육복을 입지 못한(=잃어버린) 학생 수를 빼면 체육 수업을 들을 수 있는 학생 수를 구할 수 있다.

반응형
저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 2019 카카오 개발자 겨울 인턴십 | 크레인 인형뽑기 게임 [파이썬 python]
  • 프로그래머스 | 옹알이(2) [파이썬 python]
  • 프로그래머스 | 문자열 나누기 [파이썬 python]
  • 프로그래머스 | 대충 만든 자판 [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (43)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 체육복 [파이썬 python]
상단으로

티스토리툴바