Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 운영체제와 정보기술의 원리
- 운영체제
- 쉬운 코드
- 개발남노씨
- concurrency control
- 온디바이스AI
- 커널 동기화
- 인터럽트
- SQL
- 반효경
- 시그널 핸들러
- 코딩애플
- 김영한
- 코딩테스트 [ ALL IN ONE ]
- 데이터베이스
- 네트워크
- 트랜잭션
- 갤럭시 S24
- 백엔드
- SDK
- recoverability
- 쉬운코드
- CPU 스케줄링
- Git
- vite
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- 프로세스 주소 공간
- 시스템프로그래밍
- Extendable hashing
- B tree 데이터삽입
Archives
- Today
- Total
티끌모아 태산
[백 준/구현] 1940: 주몽 본문
728x90
https://www.acmicpc.net/problem/1940
1940번: 주몽
첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고
www.acmicpc.net
풀이
import sys
input = sys.stdin.readline
from itertools import combinations
N = int(input())
M = int(input())
num = list(map(int, input().split()))
result = 0
for i in combinations(num, 2):
if sum(i) == M:
result += 1
print(result)
처음에는 조합으로 풀면 되겠다고 생각했는데, 시간 초과가 발생해서 다른 방식으로 풀어야하나 고민 중 "투포인터 알고리즘"을 활용해야 한다는 사실을 알게되었다.
- Two pointers 알고리즘
- list에 순차적으로 접근할 때, 2개의 pointer를 기록하면서 처리해나가는 알고리즘으로 이렇게 두 가지의 포인터를 사용하여 문자열이나 배열(or list)에서 원하는 값을 찾거나 반목문을 써야할 때 쓰기 좋은 방식.
- 즉, 시작점과 끝점으로 접근해야 할 데이터의 범위를 먼저 잡고 시작하는 방식에 기반
- 투 포인터는 주로 정렬된 대상을 대상으로 한다. (파이썬 알고리즘 인터뷰 - 박상길 에 의하면)
- Two pointer 방식
- 앞에서 시작하는 포인터와 끝에서 시작하는 포인터
N = int(input())
M = int(input())
num = list(map(int, input().split()))
#우선 정렬을 진행한다. 보통 투포인터 알고리즘은 정렬된 대상을 대상으로한다.
num.sort()
# start 의 index는 0, end의 index는 맨 마지막 index를 가리킨다
start = 0
end = len(num) - 1
count = 0
#start 와 end 의 합이 M과 같으면 count 1하고, 제외한다
#start의 index가 end의 index보다 작을때까지 반복한다
while start < end:
result = num[start] + num[end]
# 양 두 끝의 합이 M보다 크면 end를 한칸씩 내린다
if result > M:
end -= 1
# 양 두 끝의 합이 M보다 작으면 start를 한칸씩 올린다
elif result < M:
start += 1
else:
count += 1
start += 1
end -= 1
print(count)
이렇게 그냥 기본 방식인 탐색(반복문)을 쓰다 보면 시간이 오래 걸리거나 시간 초과가 나는 경우가 있는데 투포인터 알고리즘을 사용하면 메모리와 시간 효율성을 높일 수 있다.
728x90
'백준 문제 > 문자열,누적합,구현' 카테고리의 다른 글
[백 준/구현] 3986: 좋은 단어 (0) | 2023.12.27 |
---|---|
[백 준/구현] 11655: ROT13 (1) | 2023.12.27 |
[백 준/구현] 1213: 팰린드롬 만들기 (1) | 2023.12.26 |