본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 체육복

/  제출  1  /

 

def solution(n, lost, reserve):
    answer = 0
    students = ([2 if i in list(map(lambda x:x-1,reserve)) else 1 for i in range(n)])
    for i in range(n):
        if i+1 in lost:
            if i-1 >= 0 and students[i-1] > 1:
                students[i-1] -= 1
                students[i] = 1
            elif i+1 < n and students[i+1] > 1:
                students[i+1] -= 1
                students[i] = 1
            else:
                students[i] = 0
    return n - students.count(0)
 
채점 결과
정확성: 60.0
합계: 60.0 / 100.0

 

1,2,3,5,6,7,10,12 테스트케이스에서 실패했습니다. 건방 떨었나봅니다. 레벨 1이고 구현 사항이 빨리 잡힌다고 신나서 우다다 풀었더니 첫 제출에서 막혔습니다. 어느 문제라도 제출 전에 검토과정을 거쳐야함을 유념합니다.
 

 

/  제출  2  /

 

def solution(n, lost, reserve):
    answer = 0
    students = [1 for _ in range(n)]
    lost.sort()
    reserve.sort()
    for r in reserve:
        students[r-1] += 1
    for l in lost:
        students[l-1] -= 1
    for i in list(map(lambda x:x-1,lost)):
        if i-1 >= 0 and students[i-1] > 1:
            students[i-1] -= 1
            students[i] += 1
        elif i+1 < n and students[i+1] > 1:
            students[i+1] -= 1
            students[i] += 1
    return n - students.count(0)
채점 결과
정확성: 95.0
합계: 95.0 / 100.0
 

아예 갈아엎었습니다.

처음에 5,7,13,14 실패로

채점 결과
정확성: 80.0
합계: 80.0 / 100.0 의 결과를 얻었습니다.
lost 와 reserve가 정렬되어있다는 보장이 없었기 때문에 순서가 뒤죽박죽이어서 그랬던 것이었습니다.
진짜 예상도 못한 부분에서 어긋나서 속상했습니다. 음.. 다음에 유사 문제를 만났을 때 잘 정리할 수 있을지 걱정이 커집니다.


라고 하는 와중에 고친 코드가 상위의 2번 째 제출입니다.
5번 테스트케이스에서만 오류가 납니다. 도통 모르겠어서 연관된 테스트케이스를 질문창에서 확인했습니다.
https://programmers.co.kr/questions/27183 이 분 덕분에 이유를 찾을 수 있었습니다.

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

/  제출  3  /

def solution(n, lost, reserve):
    answer = 0
    students = [1 for _ in range(n)]
    for r in reserve:
        students[r-1] += 1
    for l in lost:
        students[l-1] -= 1
    print(students)
    for i in range(len(students)):
        if students[i] == 0:
            if i-1 >= 0 and students[i-1] > 1:
                students[i-1] -= 1
                students[i] += 1
            elif i+1 < n and students[i+1] > 1:
                students[i+1] -= 1
                students[i] += 1
    return n - students.count(0)
 
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
 

이미 lost와 reserve가 중복일 수 있으니 reserve 있는 애들이 lost된 경우에는 검사할 필요가 없는데 lost에 있다는 이유로 또 빌려오는 기능을 수행해 에러가 난 것이었습니다. 문제에서 주어진 마지막 제약을 꼼꼼히 해결하지 않아 오류난 것이었습니다. 

 

괜히 그럴 듯해보이게 풀어보려다가 돌아왔습니다. 문제에서 제시한 순서대로 일을 해결했으면 안 꼬였을 것 같은데...
코테에서 불필요한 효율성을 추구하기보다는 문제조건을 맞추고 결과를 출력하는 것에 집중해서 문제와 코드의 상황을 일치시키는 것에 공을 들입시다! 오류 없이!