코딩 기록소
반응형

문제

  • 언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.
  • 그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.

입력

  • 첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다. 두 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다고 가정한다.
# Case 1
2
5
3 2
1 4
4 1
2 3
5 5
7
3 6
7 3
4 2
1 4
5 7
2 5
6 1

출력

  • 각 테스트 케이스에 대해서 진영 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.
# Case 1
4
3

내가 제출한 풀이 - 정답

1차 (4568ms)

import sys
import heapq

t = int(sys.stdin.readline().strip())
res_list = []

for _ in range(t):
    n = int(sys.stdin.readline().strip())
    res = 0
    min_rank_list = []

    sorted_list = [tuple(map(int, sys.stdin.readline().strip().split())) for _ in range(n)]
    sorted_list.sort(key=lambda x: x[0])

    heapq.heappush(min_rank_list, sorted_list[0][1])
    res += 1

    for i in range(1, len(sorted_list)):
        if min_rank_list[0] > sorted_list[i][1]:
            res += 1
            heapq.heappush(min_rank_list, sorted_list[i][1])

    res_list.append(res)

for i in range(len(res_list)):
    print(res_list[i])

heap을 이용하여 가장 작은 순위를 저장하여 사용했지만, 곰곰히 생각하니 굳이 heap을 쓸 필요가 없다는 걸 알았다.

 

2차 (3932ms)

 

import sys

t = int(sys.stdin.readline().strip())
res_list = []

for _ in range(t):
    n = int(sys.stdin.readline().strip())
    res = 0

    sorted_list = [tuple(map(int, sys.stdin.readline().strip().split())) for _ in range(n)]
    sorted_list.sort(key=lambda x: x[0])

    min_rank = sorted_list[0][1]
    res += 1

    for i in range(1, len(sorted_list)):
        if min_rank > sorted_list[i][1]:
            res += 1
            min_rank = sorted_list[i][1]

    res_list.append(res)

for i in range(len(res_list)):
    print(res_list[i])

가장 작은 수만 사용하는데 heap을 사용할 필요가 없어서 그냥 변수에 저장하여 사용하였다.

문제풀이

문제에 대해서 이 부분을 잘 봐야한다.

  • 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.

쉽게 말해 다른 모든 지원자와 비교하여 자신이 갖고 있는 서류 심사 등수와 면접 심사 등수 둘 다 낮다면 선발되지 않는다는 뜻이다.

  A 성적 B 성적
User1 4 5
User2 3 1
결과 User2 승 User2 승

이렇게 되면 User1은 선발되지 않는다는 뜻이다. 만약, User1의 A 성적이 3보다 높았다면 선발 됐을 것이다.

 

# 지원자
3 2
1 4
4 1
2 3
5 5

# A 성적이 정렬된 지원자
1 4
2 3
3 2
4 1
5 5

# B 성적끼리 비교하여 탈락자를 선발
4 > 3	O
3 > 2	O
2 > 1	O
1 > 5	X

# 선발되지 못한 인원 수
1

A 성적은 정렬되었으니 비교할 필요가 없고, B 성적만 비교를 하면 된다. 비교하는 대상자와 비교되었던 대상자 중에 가장 작은 값을 비교하여 그것보다 낮다면 그 지원자는 통과이다. 그래서 위에 코드에서 비교되는 값이 점점 작아지는 이유이다.

반응형
profile

코딩 기록소

@seungyong20

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!