본문 바로가기
💻 하나씩 차곡차곡/프로그래머스 (Python)

[프로그래머스/LV.1/Python] 체육복

by 뚜루리 2024. 1. 17.
728x90
320x100

 

첫 도전 ...

def solution(n, lost, reserve):
    answer = n - len(lost)
    
    for i in range(len(lost)):
        if n == lost[i]: # 마지막 번호일경우
            if lost[i-1] in reserve :
                answer += 1
                reserve.remove(lost[i]-1)
        elif lost[i] == 1 : # 첫번째 번호일경우
            if lost[i+1] in reserve :
                answer += 1
                reserve.remove(lost[i]+1)
        else :
            if lost[i]-1 in reserve:
                answer += 1
                reserve.remove(lost[i]-1)
            elif lost[i]+1 in reserve:
                answer += 1
                reserve.remove(lost[i]+1)             

                
    return answer

코드실행하면 3개의 테스트 케이스에는 통과 하나

정확성이 43.3점이라는 아예 틀렸다고 무방한 점수로 통과가 안됐음......

 

근데 다른 분들 풀이를 보니 내가 문제에서 놓친 부분이 있었다. 

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

바로 이부분이였는데 그래서 체육복이 여벌인 리스트와 체육복이 도난당한 리스트에 중복된 학생이 있을 수 있다는 것.

그래서 그걸 걸러내야 함.

 

그래도 잘 안풀려서 다른 분들의 풀이를 가져왔다. 

def solution(n, lost, reserve):
    # 정렬
    lost.sort()
    reserve.sort()
	
    # 여벌 체육복을 가져온 학생도 도난당했을 수 있기 때문에 실질적으로 빌려줄 수 있는 학생만 걸러줌
    for i in reserve[:]:
        if i in lost:
            reserve.remove(i)
            lost.remove(i)
	
    print(reserve, lost)
    # 체육복 빌려주기(나의 앞 번호부터 확인)
    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)

 

  • for문에서 reserve[:] 과 reserve[] 채점 결과가 달라 그 이유를 몰랐는데 출력되는 것에서는 똑같은 것이 출력되지만 reserve[:]는 배열을 복사해서 그 기존의 배열을 유지한다고 생각하면 된다. for문 안에 remove()로 배열의 특정 값을 지우기 때문에 제대로 된 값이 안나올 수 있어서 [:]을 써서 배열을 복사하여 사용해야만 한다. 
  • 초반에 정렬을 꼭 해주어야 하는데 정렬을 해주지 않으면 값이 제대로 나오지 않는 것을 확인함.
728x90
320x100

뚜루리님의
글이 좋았다면 응원을 보내주세요!