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

 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net

백준 2018번과 비슷하게 숫자를 변수로 지정해 푸는 문제로 두 수를 더해서 특정 숫자로 만드는 경우가 몇 갠지 묻는다.

코드를 단순 구현하듯이 쓰다가 정렬을 해야지만 숫자를 포인터로 지정할 수 있겠다 싶었다.

파이썬은 sort함수를 사용하면 오름차순으로 정렬해준다.

첫 번째 숫자를 리스트의 맨 처음, 두 번째 숫자를 맨 마지막으로 지정해 준다

 

합해서 만들어야 하는 숫자가 10이라고 하자.

     first

      1       3       4      7     10     11

                                                                                                         second

first + second > 10 일 때 second를 한 칸 당긴다.

 

    first

     1      3       4       7     10     11

                                                                                   second

 

    first

     1       3       4       7     10      11

                                                             second

first + second < 10 이므로 first를 당겨준다.

 

                          first

     1       3       4       7     10      11

                                                                second

first + second = 10이므로 first와 second를 둘 다 당겨준다.(count += 1)

 

                                              first

     1       3       4       7     10      11

                                           second

반복조건은 first > second 이면 반복을 종료한다.(first >= second도 된다.)

손으로 위의 예시를 써보거나 간단한 예시 하나 만들어서 해보면 이해가 쉬울 것이다.

코드는 다음과 같다.

import sys
input = sys.stdin.readline
N = int(input())
M = int(input())
num = list(map(int, input().split()))
count = 0
num.sort()
i = 0
j = N-1

## 반복하며 카운트
while num[i] < num[j]:
  first = num[i]
  second = num[j]
  if first + second < M:
    i += 1
  elif first + second > M:
    j -= 1
  else:
    count += 1
    j -= 1
    i += 1

print(count)

 

 

 

글에 대한 조언, 질문 모두 환영합니다.

루오