[PG42862] 체육복

프로그래머스

🚩 문제설명

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

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

프로그래머스 #42862

◾ 체육복을 최대한 많이 빌려주는 것이 관건이다.

◾ 여벌의 체육복은 1복만 있다. 2복을 빌려준다고 착각하지말자.

◾ 필자는 처음에 2복을 빌려준다고 생각했음 😎

◾ 또한 주의해야할 점이 여벌의 복을 1복 가져왔는데 만약 도난당한다면 그 학생은 더이상 체육복을 빌려줄 수 없다.

 

 


 

 

✅ 입출력

n: 전체 학생의 수
lost: 체육복을 도난당한 학생 배열
reserve: 여벌의 체육복을 가져온 학생 배열
return ➡️ 체육 수업을 들을 수 있는 최대 학생의 수
n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

 

 


 

 

📑 문제 풀이

with 파이썬 (Python)
def solution(n, lost, reserve):
    # 여벌옷 X 도난만 당한
    lost_ = set(lost) - set(reserve)
    # 도난 X 여벌옷 있는 : 다른사람한테 빌려줄 수 있는
    reserve_ = set(reserve) - set(lost)
    
    for i in reserve_:
        if i - 1 in lost_:
            lost_.remove(i - 1)
        elif i + 1 in lost_:
            lost_.remove(i + 1)
            
    answer = n - len(lost_)
    print("답:", answer)

◾ lost_ 배열은 여벌옷이 없이 도난만 당한 학생을 이른다.

  • 그렇담 얘네는 빌려주기만을 기다려야 한다.
  • 그니까 이 배열의 수를 줄여야만 최대한 많은 학생에게 체육복을 빌려줄 수 있을 것이다.

◾ reserve_ 배열은 도난당하지않고 여벌옷도 있는 학생을 이른다.

  • 즉, 얘네가 도난 당한 학생들에게 여벌 옷을 빌려줘야만
  • 체육복이 없는 학생 수를 줄일 수 있어 최대한 많은 학생에게 체육복을 빌려줄 수 있을 것이다.

◾ 일단 반복문을 돈다.

◾ 반복문은 도난X 여벌옷O 학생들 배열에서 돈다. (reserve_)

◾ 만약에 reserve_ 요소에서 i - 1 값이 lost_에 있다면

  • lost_ 에서 i - 1 값을 제거해준다.
  • 즉, 만약에 lost_ = [1, 4] 라고 하고
  • reserve_ = [2] 라고 한다면 2 - 1 = 1 이 lost_에 있으니까 1은 체육복을 빌릴 수 있는 상태라서
  • lost_에서 지워져도 된다.
  • 그니까 지워지는 이 과정은 도난당한 애들이 여벌옷을 빌리는 과정인 것이다.

◾ 마지막에 lost_ 배열의 길이를 n 에서 빼준다.

  • 즉, 전체 학생 수 에서 체육복이 없는 애들을 빼주는 것이다.
  • 그러면 체육 수업을 들으러 갈 수 있는 학생 수를 구할 수 있게 된다.

 

 

 

 

 

 

 

 

 

 

 


 

728x90