[백준] 1205번 등수 구하기

거북이·2023년 1월 14일
0

백준[실버4]

목록 보기
50/91
post-thumbnail

💡문제접근1

  • 태수의 새로운 점수를 반복문으로 받아온 점수와 비교했을 때 태수의 새로운 점수가 더 높은 시점에 새로운 점수를 insert해주었다.
  • 새 점수가 위치한 인덱스를 저장하고 이 값이 만약 랭킹 리스트에 들어갈 점수의 개수 P보다 크다면 들어갈 수 없으므로 -1을 출력한다. 만약 랭킹 리스트가 꽉 차있을 때, 새 점수가 랭킹 리스트의 마지막 점수와 같다면 점수가 바뀌지 않으므로 랭킹 리스트에 올라갈 수 없다. 따라서 이 경우에도 -1을 출력한다.
  • 근데 코드1을 실행한 결과 ValueError(참조 불가)가 출력되었다. 그 이유는 아래의 테스트케이스를 통해서 살펴보자.

💡테스트케이스

입력

9 5 10
10 10 10 9 9 8 7 6 6

출력

10

  • 내 코드대로 따라가면 5점을 점수 리스트에 넣을 수 없게 된다. 왜냐하면 점수 리스트에 있는 점수가 전부 6점 이상인 상황이므로 for문을 끝까지 돌려 비교해도 5점이 들어갈 위치는 나오지 않기 때문에 ValueError가 발생한 것이다.

💡코드1

N, new_score, P = map(int, input().split())
score = list(map(int, input().split()))

if N == 0:
    print(1)
else:
    for i in range(len(score)):
        if score[i] < new_score:
            score.insert(i, new_score)
            break

    rank = score.index(new_score) + 1
    if rank > P:
        print(-1)
    else:
        if N == P and new_score == score[-1]:
            print(-1)
        else:
            print(rank)

💡문제접근2

ValueError를 수정하기 위해서 for문을 지우고 아예 append로 추가해준 다음 sort(reverse=True)를 이용해서 내림차순 정렬을 해주고 동점 점수대라면 동점 점수중에서 가장 마지막에 위치한 점수를 인덱스로 찾아내어 경우에 해당하는 실행문을 실행할 수 있도록 코드를 재작성했다.

💡코드2(메모리 : 30616KB, 시간 : 36ms)

N, new_score, P = map(int, input().split())

if N == 0:
    print(1)
else:
    score = list(map(int, input().split()))
    score.append(new_score)
    score.sort(reverse=True)
    rank = score.index(new_score) + 1
    if rank > P:
        print(-1)
    else:
        if N == P and new_score == score[-1]:
            print(-1)
        else:
            print(rank)

💡소요시간 : 37m

0개의 댓글