[백준] 1806 부분합 in Python : 투 포인터

2022. 3. 13. 18:22·Algorithm (PS)
728x90

1. 정직한 나의 dp 풀이 

시간초과가 났다 

# 1806 부분합

n, s = map(int, input().split())
array = list(map(int, input().split()))
INF = int(1e9)
dp = [INF] * (n+1)

for i in range(n):
    temp = array[i]
    count = 1
    for j in range(i+1, n):
        if temp >= s:
            dp[i] = count
            continue
        else:
            temp += array[j]
            count += 1

print(min(dp))

2. 유형을 보니까 투포인터 알고리즘을 사용하는 것이다. 

먼저 0번째 인덱스부터 현재 인덱스까지의 원소들의 합을 저장해 놓은 sum_array를 새로 만들어야 한다. 

그리고 sum_array에서 start = 0 , end = 1 으로 인덱스를 설정한다. 

sum_array[end] - sum_array[start] 가 부분합이 되며, 이 부분합이 S이상인지 확인한다. 

S 이상이라면 시작점이 'start == 0'인 경우는 확인한 것이므로, start 를 한칸 뒤로 이동시킨다. 

S 이하라면 아직 우리는 0 부터 시작하는 순열에 원소를 더 더해주어야 한다는 의미이므로 end 를 뒤로 이동시킨다. 

단, end 가 n 에 이미 도달했다면, start를 이동시켜야 sum_array의 index 초과를 하지 않는다. 

# 1806 부분합
INF = int(1e9)
n, s = map(int, input().split())
array = list(map(int, input().split()))
sum_array = [0]*(n+1)
for i in range(1, n+1):
    sum_array[i] = sum_array[i-1] + array[i-1]

# 투포인터
start = 0
end = 1
count = INF

while start < n:
    if sum_array[end] - sum_array[start] >= s:
        if end - start < count: # array[end] 값을 포함하지 않으므로 end - start 가 맞다 
            count = end - start
        start += 1 # start 지점 이동
    else:
        if end != n:
            end += 1
        else: # end == n end가 가장 마지막 인덱스에 있을 때
            start += 1


if count == INF: # 합 s 불가능
    print(0)
else:
    print(count)
728x90

'Algorithm (PS)' 카테고리의 다른 글

[Python] 소수판별 알고리즘/에라토스테네스의 체  (0) 2022.09.10
[leetcode] valid palindrome 125  (3) 2022.09.05
[백준] 2252 줄세우기 in python + 위상정렬(topology_sort)  (0) 2022.03.08
[백준] 1987 알파벳 in Python : 백트래킹 + 시간초과 해결하기..  (0) 2022.03.01
[백준] 1197 최소 스패닝 트리 in Python : 크루스칼 알고리즘으로 구현  (0) 2022.02.28
'Algorithm (PS)' 카테고리의 다른 글
  • [Python] 소수판별 알고리즘/에라토스테네스의 체
  • [leetcode] valid palindrome 125
  • [백준] 2252 줄세우기 in python + 위상정렬(topology_sort)
  • [백준] 1987 알파벳 in Python : 백트래킹 + 시간초과 해결하기..
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • BFS
  • AWS
  • 프로그래머스
  • EC2
  • 알고리즘
  • 운영체제
  • 카카오코딩테스트
  • 데이터엔지니어
  • python
  • 백준
  • dfs
  • Databricks
  • Swift
  • dp
  • 리눅스
  • docker
  • 파이썬
  • 빅데이터
  • 코딩테스트
  • Kubernetes
  • 클라우드
  • SPARK
  • 데이터브릭스
  • 쿠버네티스
  • linux
  • 백트래킹
  • ansible
  • 스파크
  • Leetcode
  • 데이터엔지니어링

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 1806 부분합 in Python : 투 포인터
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.