[프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-체육복

2024. 10. 14. 15:42·코딩테스트/프로그래머스
728x90
반응형

📌 문제 링크 

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

 

프로그래머스

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

programmers.co.kr

 

📌 문제 설명 

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

# 제한사항

  1. 전체 학생의 수는 2명 이상 30명 이하입니다.
  2. 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  3. 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  4. 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  5. 📢 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

 

📌 풀이 과정 

✅ 2가지 방안이 있다. 

  1. lost를 기준으로 찾는다. 
    • for문을 lost에 대해 돌린다. 즉, " 나 잃어버렸는데, 도와줄 사람이 있는지 앞뒤로 찾는 방법 "
  2. reserve를 기준으로 찾는다. 
    • for문을 reserve에 대해 돌린다. 즉, " 나 여벌 옷 있는데, 도와줄 수 있는 사람이 있는지 앞뒤로 찾는 방법 "
    • => 내가 선택한 방법 (이유는 그냥.. 잃은 사람보다 여벌 옷 가져온 사람이 적을 것 같아서..)

✅ 배운 점 

  1. 리스트 list 는 뺄셈 (-) 연산이 불가능하다. (reserve - lost 하면 제한사항 5번을 만족시킬 수 있을 것 같았지만 안되더라고)
    • 해결: sub_set = [x for x in list1 if x not in list2] 이 방법을 써야 한다. 
  2. 놓친 테스트 케이스는 어떻게 생각해낼 수 있는 건지.. 아래는 내가 놓쳤던 테스트 케이스이다. 
    • reserve, lost가 정렬되지 않은 경우 
    • (제한사항 5번 반영) reserve 인 사람 전부 또는 일부가 lost일 때 
    • 📢 lost = [4, 5] reserve = [3, 4] 인 경우
      1. reserve 순서대로 보면 전부 체육복을 입을 수 있을 것 같다. 하지만, 4번은 여벌이 있었으나 도난당해 빌려줄 수 없는 상태다. 따라서 lost = [5] reserve = [3] 인 상태로 봐야 한다. 
      2. 이를 위해서 리스트 뺄셈 연산을 아래 코드 대신해 적었다. 
# 여벌 옷은 있으나, 도난 당해 더 이상 빌려줄 수 없는 경우이다. 
# lost = [4, 5] reserve = [3, 4]일 때는 정상작동하지 않는다. 
# 이유: able_stdNo = 3 일 때 lost를 보면 if문이 동작하지 않아 4번으로부터 빌리게 된다. (실제로는 불가능) 
if able_stdNo in lost: 
    done.append(able_stdNo)
    lost.remove(able_stdNo)
    continue

📌 풀이 코드 

  • reserve 각 요소(able_stdNo)에 대해서, 
    • 앞 뒤로 도와줄 수 있는 사람이 있는지 find_lost 에 저장한다. 
    • find_lost의 각 요소 (i) 에 대해서, 
      • lost 안에 있는지 & 유효범위 내의 번호인지 & 빌려주는 번호 able_stdNo가 아직 빌려주지 않은 상태이면 
      • 빌려준 사람 stdNo 는 done에 추가하고 
      • 빌림 받은 사람 i 는 lost에서 제거한다. 
def solution(n, lost, reserve):
    answer = 0
    done = [] 
    reserve.sort(); lost.sort() # 순서대로 제공된다고는 안함. 
    # 1. 리스트는 뺄셈 안됨. sub_set = [x for x in list1 if x not in list2] 
    tmp = reserve
    reserve = [x for x in reserve if x not in lost]
    lost = [x for x in lost if x not in tmp]
    print(reserve, lost)
    for able_stdNo in reserve:
        if len(lost) == 0: 
            return n
        # 여벌도 있지만, 동시에 도난을 당해서 빌려주기 불가. done으로 옮기기
        # 1.로 대체된 부분.
        # if able_stdNo in lost: 
        #     done.append(able_stdNo)
        #     lost.remove(able_stdNo)
        #     continue
        find_lost = [able_stdNo-1, able_stdNo+1]
        for i in find_lost: 
            if (i in lost) and (0<i<=n) and (able_stdNo not in done):    
                done.append(able_stdNo)
                lost.remove(i)
                # print(done, lost)
    answer = n - len(lost) 
    return answer
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-구명보트  (2) 2024.10.16
[프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-큰수만들기  (0) 2024.10.16
[프로그래머스/Python] 알고리즘고득점kit-완전탐색-소수찾기  (0) 2024.10.14
[프로그래머스/Python] 알고리즘고득점Kit - 완전탐색 - 모의고사  (2) 2024.10.14
[프로그래머스/Python] 알고리즘고득점Kit-완전탐색-최소직사각형  (1) 2024.10.14
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-구명보트
  • [프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-큰수만들기
  • [프로그래머스/Python] 알고리즘고득점kit-완전탐색-소수찾기
  • [프로그래머스/Python] 알고리즘고득점Kit - 완전탐색 - 모의고사
heeya16
heeya16
개발 공부 냠냠
  • heeya16
    개발자 희야
    heeya16
  • 전체
    오늘
    어제
    • 분류 전체보기 (105)
      • 코딩테스트 (66)
        • 프로그래머스 (38)
        • SWEA (2)
        • BAEKJOON (26)
      • 알고리즘 (7)
      • 자료구조 (19)
      • 프로젝트 (5)
      • 취업 주르륵 (2)
      • 데이터베이스 (0)
      • IT지식 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    1003
    10448
    10773
    10월
    10진수
    11047
    11399
    11403
    11866
    1449
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
heeya16
[프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-체육복
상단으로

티스토리툴바