코딩테스트/프로그래머스

[프로그래머스] [Level 1] [탐욕법(Greedy)] 체육복

박소민 2022. 3. 21. 11:10
문제) 체육복
 

코딩테스트 연습 - 체육복

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

programmers.co.kr

 

  • 내 풀이
    1. 잃어버리지 않은 경우
    2. 잃어버렸지만 여분 옷이 있던 경우
    3. 잃어버린 학생들 중 양 옆 번호에 여분 옷을 가지고 있는 경우
    4. 여분 옷을 가지고 있는 학생이 남은 경우 합산(중복 값은 set함수로 사라질 예정)
      • → 1번과 같은 경우인데 이 코드가 없으면 정답이 X
      • 잘못된 풀이 방법인 것 같다
  • 5번 테스트 케이스 실패
def solution(n, lost, reserve):
    lost.sort()
    reserve.sort()
    have=[i for i in range(1,n+1) if i not in lost]
    for l in lost:
        if l in reserve: #여벌 옷 가진 학생이 잃어버린 경우 여벌 옷 없는 것으로 간주
            have.append(l)
            reserve.remove(l) 
            lost.remove(l)
            
    for ls in lost:
        if ls-1 in reserve:
            have.append(ls)
            reserve.remove(ls-1)
        elif ls+1 in reserve:
            have.append(ls)
            reserve.remove(ls+1)
    
    #reserve에 남은 학생도 추가
    have+=reserve
    
    answer=len(set(have))
    return answer

 

  • 내 풀이
    • 잃어버린 학생 중 맨 마지막 번호 학생이 있는 경우 코드 추가
    • 통과 
    • 했지만 문제 오류 인듯 하다
def solution(n, lost, reserve):
    lost.sort()
    reserve.sort()
    have=[i for i in range(1,n+1) if i not in lost]
    for l in lost:
        if l in reserve: #여벌 옷 가진 학생이 잃어버린 경우 여벌 옷 없는 것으로 간주
            have.append(l)
            reserve.remove(l) 
            lost.remove(l)
            
    for ls in lost:
        if ls==n:
            ls=0
        if ls-1 in reserve:
            have.append(ls)
            reserve.remove(ls-1)
            continue
        elif ls+1 in reserve:
            have.append(ls)
            reserve.remove(ls+1)
            
    #reserve에 남은 학생도 추가
    have+=reserve
    
    answer=len(set(have))
    return answer

 

  • 다른 사람 풀이
    1. 잃어버리지 않고 여벌 옷 가진 경우
    2. 여벌 옷 없이 잃어버린 경우 → 1번 경우의 학생에게 여벌 옷 받을 수 있음
    3. 체육수업 참가 가능 학생 = 전체 - (잃어버린 학생 들 중 여벌 옷 받지 못한 학생)
def solution(n, lost, reserve):
    lost.sort()
    reserve.sort()
    _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)