본문 바로가기
IT/알고리즘

백준 - 1946번

by Sungjun_ 2020. 11. 25.

문제

https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

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

www.acmicpc.net

 


코드

import sys

T = int(input())

for _ in range(T):
    N = int(input())
    cnt = 1
    lst = []
    for _ in range(N):
        x = list(map(int, sys.stdin.readline().rstrip().split()))
        lst.append(x)
    lst.sort()
    min = lst[0][1]
    for i in range(1, N):
        if min > lst[i][1]:
            min = lst[i][1]
            cnt += 1
    print(cnt)

 

이번 문제는 2가지 버전의 코드가 있습니다.

위 코드는 값을 입력받고 서류 심사 성적을 기준으로 오름차순 정렬을 해줬습니다.

그 후 최솟값을 정해주고 현재 최솟값 보다 작은 수가 나오면 순위 높은 것이기 때문에

최솟값을 바꿔주고 cnt에 +1을 했습니다.

cnt가 1로 시작하는 이유는 첫 번째 원소는 서류 성적이 1등이기 때문입니다.

그래서 for문의 인덱스도 1부터 시작하는 것입니다.

 

import sys

T = int(input())

for _ in range(T):
    N = int(input())
    cnt = 1
    lst = [0] * (N+1)
    for _ in range(N):
        a, b = map(int, sys.stdin.readline().rstrip().split())
        lst[a] = b
    min = lst[1]
    for i in range(2, N+1):
        if min > lst[i]:
            min = lst[i]
            cnt += 1
    print(cnt)

 

위 코드가 첫 번째 코드보다 좀 더 효율적입니다.

일단 a,b 값을 각각 인덱스(서류심사 순위)와 값에 넣었기 때문에

따로 오름차순 정렬을 해줄 필요가 없습니다.

min이 인덱스1부터 시작하는데, 그 이유는 0순위는 없기 때문에 lst[0] = [0]이라 

제대로 비교가 되지 않습니다.

for문의 범위도 같은 이유에서 2부터 시작합니다.

 

결과

첫 번째 결과가 마지막에 작성한 코드이고, 두 번째 결과가 처음 작성한 코드입니다.

 

그리고 sys를 이용해 받을 경우 str형이기 때문에 int형으로 변환시켜주어야 합니다.

저는 생각도 못하고 있다가 틀렸어서 혹시 몰라서 남깁니다.

'IT > 알고리즘' 카테고리의 다른 글

알고리즘 - 퀵 정렬(2)  (0) 2020.12.04
알고리즘 - 퀵 정렬(1)  (0) 2020.12.01
백준 - 1764번  (0) 2020.11.25
백준 - 10610번  (0) 2020.11.25
백준 - 10815번  (0) 2020.11.24

댓글