본문 바로가기

Algorithm Problems/투 포인터

[백준/Python] 26091번: 현대모비스 소프트웨어 아카데미

문제

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

 

26091번: 현대모비스 소프트웨어 아카데미

첫째 줄에 견학을 희망하는 학회원의 수 $N$과 견학하는 팀의 최소 능력치를 나타내는 정수 $M$이 공백으로 구분되어 주어진다. ($1 \le N \le 100\,000$, $1 \le M \le 10^9$) 둘째 줄에 학회원 $N$명의 능력치

www.acmicpc.net


문제 요약

현대모비스에서 소프트웨어 아카데미 견학생 팀을 모집한다.

 

조건 1. 팀원이 두명이다.조건 2. 팀의 능력치가 M이상이다. 팀의 능력치는 모든 팀원의 능력치를 합한 값이다.

 

N명의 학회원들 중 견학을 보낼 수 있는 최대 팀 수를 출력한다.


코드

N, M = map(int, input().split())

arr = sorted(list(map(int, input().split())))

s = 0
e = N - 1

cnt = 0

while s < e:
    if arr[s] + arr[e] >= M:
        cnt += 1
        s += 1
        e -= 1
    else:
        s += 1

print(cnt)

코드 설명

1. 입력 받은 학회원들의 능력치를 저장한 배열을 정렬한다. (투 포인터 방식을 사용하기 위해)

 

2. s(start) 포인터가 e(end) 포인터를 앞질러가기전까지 탐색한다.

 

3. 두 포인터가 가리키는 값의 합이 M이상이면 s는 1 증가, e는 1 감소시키고 cnt를 1 증가시킨다.

+ 한 번 견학을 갈 팀을 구성한 학회원은 다시 팀을 짤 수 없으므로 두 포인터 모두 이동시킨다.

 

4. 두 포인터가 가리키는 값의 합이 M보다 작다면, s만 증가시킨다. (두 값의 합을 증가시키기 위해)

 

5. 탐색이 종료되면 cnt를 출력한다.