물음표 살인마의 개발블로그

알고리즘 문제/백준

코스튬 파티 #6159

BEstyle 2023. 1. 11. 06:10

문제

한 농부가 할로윈 파티에 그의 소들을 데려가려고한다. 아쉽게도 농부에게는 코스튬이 한벌밖에 없다. 그 코스튬에는 정확하게 사이즈는 S(1 <= S <= 1,000,000)이며, 최대 소 두마리가 들어간다. 농부는 N(2 <= N <= 20,000)마리의 소가 있으며(소의 이름은 편의상 소1.. 소N으로한다), 소i의 사이즈는 (1 <= L_i <= 1,000,000)이다. 만약 소 두마리의 크기 합이 코스튬의 크기 이하인 경우 둘이 코스튬에 들어갈 수 있다. 농부가 코스튬에 얼마나 많은 서로 다른 소의 짝이 들어가는지 구할수있도록 도와주자.

입력

첫째 줄에는 정수 N(소의 수)과 S(코스튬의 크기)가 주어진다.

둘째 줄부터는 각 줄에 소들의 크기가 주어진다.

출력

첫째 줄에 얼마나 많은 짝이 가능한지 출력한다.

예제 입력 1 복사

4 6
3
5
2
1

예제 출력 1 복사

4

힌트

위의 문제에서 4개의 짝은 아래와 같다.

  • 소1-소3 (사이즈 합:5)
  • 소1-소4 (사이즈 합:4)
  • 소2-소4 (사이즈 합:6)
  • 소3-소4 (사이즈 합:3)

출처

Olympiad > USA Computing Olympiad > 2007-2008 Season > USACO January 2008 Contest > Bronze 1번


# https://www.acmicpc.net/problem/6159

'''
1. 아이디어 :
    1) 이중 포문을 돌면서 모든 경우의 수를 구한다
    2) 두 포인터로 lp=0, rp=n-1로 지정하고, while문안에 lp와 rp가 같아질때까지, [lp]+[rp]가 target보다 작거나 같아질때까지 반복한 후, lp와 rp 사이의 숫자들 +1을 ans에 더해준다.
2. 시간복잡도 :
    1) O(n^2)
    - 이중 포문
    2) O(logn) * O(n) = O(nlogn)
    - 정렬 + while문
3. 자료구조 :
    1) 배열
    2) 배열
'''

import sys

input = sys.stdin.readline
n, target = map(int, input().split())
cows = sorted([int(input()) for _ in range(n)])
ans = 0
lp = 0
rp = n - 1
while 1:
    if lp==rp:
        break
    if cows[lp] + cows[rp] > target:
        rp -= 1
    elif cows[lp] + cows[rp] <= target:
        ans += rp - lp
        lp += 1
print(ans)
#===============================================================================
input = sys.stdin.readline
n, target = map(int, input().split())
cows = [int(input()) for _ in range(n)]
ans = 0
for i in range(n-1):
    for j in range(i+1, n):
        if cows[i]+cows[j] <= target:
            ans+=1
        else:
            break
print(ans)

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

문자열 교환 #1522  (0) 2023.01.11
The Pleasant Walk #19829  (1) 2023.01.11
에디터 #1406  (0) 2023.01.11
쇠막대기 #10799  (0) 2023.01.11
탑 #2493  (0) 2023.01.11