[Python] BOJ / 1946번 / 신입 사원

2023. 4. 25. 12:59·🥇 Problem Solving/Greedy
 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

 

📝 문제

언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.

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

이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.

 

📜 풀이

  • 각 지원자들의 성적을 특정 열(서류심사 성적, 면접시험 성적)을 기준으로 정렬하면 나머지 하나의 열만 비교함으로써 해당 지원자 선발될 수 있는지 아닌지를 판별할 수 있음
  • 예로, (3, 2), (1, 4), (4, 1), (2, 3), (5, 5)로 입력이 주어진 경우 이를 1열을 기준으로 오름차순 정렬하면 다음과 같음

1 4

2 3

3 2

4 1

5 5

  • 이때 1행에 해당하는 지원자의 경우 서류심사 성적을 1위로 받았기 때문에 면접시험 성적과 상관없이 무조건 선발될 수 있다.
  • 2행부터는 서류심사 성적을 본인보다 높은 순위로 받은 지원자가 존재하기 때문에 다른 지원자와 면접시험 성적을 비교하여 두 성적 모두 다른 지원자보다 떨어지는지 확인해야한다.
  • 이때, 만약 면접시험 성적의 순위가 현재 행의 윗 행들과 비교하여 하나라도 떨어진다면, 해당 지원자는 선발될 수 없는 지원자라는 것을 확인할 수 있다.

 

💻 소스코드

  • 아래 코드는 시간 초과로 통과 실패한 코드이다.
import sys
input = sys.stdin.readline

for _ in range(int(input())):
    n = int(input())
    score = [list(map(int, input().split())) for _ in range(n)]

    score.sort(key=lambda x: x[0])

    cnt = 0
    for i in range(n):
        for j in range(i):
            if score[i][1] > score[j][1]:
                cnt += 1
                break
    print(n - cnt)
  • 위 코드에서 시간복잡도를 줄인 코드는 아래와 같다.
import sys
input = sys.stdin.readline

for _ in range(int(input())):
    n = int(input())
    score = [list(map(int, input().split())) for _ in range(n)]

    score.sort(key=lambda x: x[0])

    low = 0
    ans = 1
    for i in range(1, n):
        if score[i][1] < score[low][1]:
            low = i
            ans += 1
    print(ans)
저작자표시 (새창열림)

'🥇 Problem Solving > Greedy' 카테고리의 다른 글

[Python] BOJ / 1449번 / 수리공 항승  (0) 2023.04.26
[Python] BOJ / 16953번 / A → B  (0) 2023.04.25
[Python] BOJ / 13305번 / 주유소  (0) 2023.04.24
[Python] BOJ / 2812번 / 크게 만들기  (0) 2022.06.29
[Python] BOJ / 3109번 / 빵집  (0) 2022.06.04
'🥇 Problem Solving/Greedy' 카테고리의 다른 글
  • [Python] BOJ / 1449번 / 수리공 항승
  • [Python] BOJ / 16953번 / A → B
  • [Python] BOJ / 13305번 / 주유소
  • [Python] BOJ / 2812번 / 크게 만들기
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 1946번 / 신입 사원
상단으로

티스토리툴바