연습장

7. 체육복 본문

프로그래머스/1단계

7. 체육복

js0616 2023. 12. 12. 00:50

 

n - 전체 학생수

lost - 체육복이 없다.

reserve - 체육복이 여벌이 있다.

return - 체육 수업을 듣는 학생 수

 

특이한 점으론 lost 와 reserve 가 같게 되면 빌리거나 빌려줄 수 없다는 점이다. 

즉 lost 와 reserve 의 원소가 겹치면 양쪽 배열에서 지워버리는게 좋은 해결 방법이 될 걸로 예상


 

1. lost 와 reserve 에 중복되는 원소 확인 및 처리

2. lost 에서 1을 빼거나 1을 더했을때 reserve 에 해당 숫자가 있어야 빌릴 수 있음

3. 빌리고 나서는 더 빌리면안됨. [3] 이 [2,4] 에게 각각 빌리면 2번 빌리는 경우가 나올 수 있음. 

 

 

 


def solution(n, lost, reserve):
    answer = 0

    num = 0  # 체육복을 빌린 사람 수 
    # 1. 중복되는 원소 확인
    for i in lost:
        if i in reserve:
            lost.remove(i)
            reserve.remove(i)
    
    # 2. 빌려줄사람 찾기
    for i in lost: # 없는 사람 중에서


        # 앞사람이 여분이 있는지?
        if i-1 in reserve: 
            num +=1 # 사실 lost.remove(i) 로 진행하였는데, 그렇게 되면 lost 의 원소가 줄어서 for 문이 돌지 않는다.
            reserve.remove(i-1)


        # 뒷사람이 여분이 있는지?
        elif i+1 in reserve:
            num +=1
            reserve.remove(i+1)
            
    answer = n - len(lost) + num
    
    return answer

 


오류가 났다. 예외가 있다고 한다. 

n = 2 일 경우에 대해서 테스트 케이스를 넣어 처리해봤다 -> 이상이없는거같다.

앞사람에게 우선으로 빌리도록 하여서 오류가 났을까..

 

lost.sort()  구문을 넣었더니 2개의 테스트 케이스의 오류를 해결하였다. 

잃어버린 사람의 순서가 정렬되어 있지 않았던 것 같다.

 

 # lost 정렬하여 앞사람부터 빌리도록하는 이유는 다음과 같다. 

만약 lost 순서가 틀어지게 되면 위의 그림처럼 빌려가서 예외가 발생하기 때문에 방향을 일정하게 해주어야 한다.

 

 

 

num +=1 # 사실 lost.remove(i) 로 진행하였는데, 그렇게 되면 lost 의 원소가 줄어서 for 문이 돌지 않는다. 라고 했었는데 마찬가지로  -> 지우는 과정에서 오류가 났을것 같다.  -> 지워야되는 원소목록을 만들어서 따로 1-1 에서 지우도록 하였다.

 

 


def solution(n, lost, reserve):
    answer = 0
    num = 0
    del_list = []


    # 1. 지울 리스트 만들기
    for i in lost:
        if i in reserve:
            del_list.append(i)
            
    # 1-1 지우기
    for i in del_list:
        lost.remove(i)
        reserve.remove(i)
    
    # lost 정렬하여 앞사람부터 빌리도록함
    lost.sort()
    
    # 2. 빌려줄사람 찾기
    for i in lost:
        # 앞사람이 여분이 있는지?
        if i-1 in reserve: 
            num +=1
            reserve.remove(i-1)
        # 뒷사람이 여분이 있는지?
        elif i+1 in reserve:
            num +=1
            reserve.remove(i+1)

    answer = n - len(lost) + num
    
    return answer

 

'프로그래머스 > 1단계' 카테고리의 다른 글

9. 완주하지 못한 선수  (0) 2023.12.14
8. 문자열 나누기  (0) 2023.12.12
6. 숫자 짝궁  (0) 2023.12.12
5. 로또의 최고 순위와 최저 순위  (0) 2023.12.11
4. 옹알이2  (0) 2023.12.11