반응형

문제풀이

1. 각 요소가 (서류 순위, 면접 순위)인 리스트 l을 만든 후, 서류 순위를 기준으로 l을 정렬해줍니다.

2. 정렬된 l에서 앞에서부터 튜플을 하나씩 꺼내며 면접 순위가 이전에 선발된 사람보다 높은(숫자가 낮은) 사람을 선발하게 됩니다.


백준의 두번째 예시

[(1, 4), (2, 5), (3, 6), (4, 2), (5, 7), (6, 1), (7, 3)]

를 살펴보면 다음과 같습니다.

- 먼저 서류 1등은 당연히 뽑히게 됩니다. 2, 3등은 서류 순위, 면접 순위 모두 서류 1등보다 낮으므로 선발되지 않습니다.

- 서류 4등의 경우, 서류 1등보다 면접 등수가 높으므로 선발됩니다.

- 서류 5등의 경우에는 서류 4등보다 면접 등수도 낮으므로 선발되지 않습니다.

- 서류 6등의 경우에는 서류 4등보다 면접 등수가 높으므로 선발됩니다.

- 서류 7등의 경우에는 면접 등수도 서류 6등보다 낮으므로 선발되지 않습니다.


Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys
readline = sys.stdin.readline
 
def main(n):
    for _ in range(n):
        #l = sorted([tuple(map(int,readline().split())) for _ in range(int(readline()))],key = lambda x : x[0])
        l = []
        for x in range(int(readline())):
            l.append(tuple(map(int,readline().split())))
        l = sorted(l,key = lambda x : x[0])
        tmp = l[0][1]
        ans = 1
        for n,m in l:
            if m < tmp :
                tmp = m
                ans += 1
        print(ans)
if __name__ == '__main__':
    n =int(readline())
    main(n)
cs

Line 7 : l은 (서류 등수, 면접 등수)가 들어갈 리스트입니다. Line 7~10을 Line 6 한줄로 축약할 수 있습니다.

*축약할 경우 소요시간이 3584 -> 3996 ms로 길어지게됩니다.

문제 링크

 

1946번: 신입 사원

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

www.acmicpc.net

 

반응형

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

백준 4673 셀프 넘버 Python  (0) 2020.12.10
백준 4344 평균은 넘겠지 Python  (0) 2020.12.09
백준 20162 간식 파티 Python  (0) 2020.12.08
백준 1149 RGB거리 Python  (0) 2020.12.08
백준 1309 동물원  (0) 2020.12.07
반응형

문제풀이

30의 배수가 될 조건은 아래와 같다.

1. 0이 한개 이상 들어가야한다.

2. 모든 수의 합이 3의 배수여야한다.(1230 이면, 1230의 합은 1+2+3+0 = 6)

 

1. collections.Counter 를 이용하여 받은 숫자들을 한자리씩 잘라 센다.(위의 조건2를 위한 과정)

2. 1에서 센 딕셔너리의 key*value 의 합이 3의 배수인지 확인한다.(조건2)

3. 조건1, 2를 만족한다면 숫자들을 큰 수부터 붙여나간다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys,collections
 
def sol(n):
    dic = collections.Counter(n)
    check = sum(int(k)*for k,v in dic.items())
    if "0" not in dic or check%3!=0:
        return -1
    else :
        ans = ""
        for i in range(9,-1,-1):
            str_i = str(i)
            if str_i in dic :
                for _ in range(dic[str_i]):
                    ans += str_i
        return ans
 
if __name__ == "__main__":
    n=sys.stdin.readline().split()[0]
    print(sol(n))
cs

Line 4 : 주어진 숫자를 하나씩 잘라 개수를 센다.

Line 5 : 숫자들의 합을 계산한다.

Line 6 : 조건 1 만족 여부를 확인한다.

Line 8 : 조건1, 2를 모두 만족한 경우로 큰 숫자부터(9부터) 붙여나간다.

문제 링크

 

10610번: 30

문제 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다. 미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라. 입력 N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다. 출력 미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는

www.acmicpc.net

 

반응형

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

백준 1002 터렛  (0) 2020.04.09
백준 11048 이동하기  (0) 2020.03.30
백준 2436 공약수  (0) 2020.03.24
백준 2559 수열  (0) 2020.03.23
백준 1058 친구  (0) 2020.03.19

+ Recent posts