HelloMinchan
처음처럼
HelloMinchan
LinkedIn
전체 방문자
오늘
어제
  • 분류 전체보기 (306)
    • Backend (4)
      • NestJS (1)
      • Express (1)
      • Spring (2)
    • Infrastructure (1)
      • AWS (1)
    • Frontend (1)
      • Next.js (1)
    • Language & Runtime (4)
      • Java (2)
      • Node.js (2)
    • Computer Science (8)
      • Computer Networks (3)
      • Operating Systems (4)
      • OOP (1)
    • 독서 (4)
      • 데이터 중심 애플리케이션 설계 (3)
      • 객체지향의 사실과 오해 (1)
    • 회고 (4)
      • Project (2)
      • Career (2)
    • Deprecated (280)

채널

  • GitHub
  • LinkedIn

최근 글

태그

  • 알고스팟
  • 백엔드
  • 프로그래머스Python
  • front-end
  • 백준C++
  • back-end
  • 프로그래밍
  • 프로그래머스C++
  • 코딩
  • Baekjoon Online Judge
  • 백준
  • 백준Go
  • 데이터베이스
  • 개발자
  • 프로그래머스
  • Algospot
  • 알고스팟Python
  • 백준Python
  • Database
  • programmers

최근 댓글

인기 글

hELLO
HelloMinchan

처음처럼

[Baekjoon Online Judge] 백준 11003번 최솟값 찾기(Python)
Deprecated

[Baekjoon Online Judge] 백준 11003번 최솟값 찾기(Python)

2020. 5. 15. 18:04

© 2020 All Rights Reserved. 주식회사 스타트링크

[Baekjoon Online Judge] 백준 11003번 최솟값 찾기

(Python)

(글쓴날 : 2020.05.15)

 


* Baekjoon Online Judge, 백준 11003번 문제 Python 언어 풀이입니다.

* 소스 코드의 저작권은 글쓴이에게 있습니다.


 

 

백준 11003번 최솟값 찾기


1) 문제

문제 링크 : https://www.acmicpc.net/problem/11003

 

11003번: 최솟값 찾기

N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.

www.acmicpc.net


2) 풀이 과정

* 시간 복잡도 : O(n)

 

N개의 수가 주어지고 특정 범위가 주어질 때, 해당 범위 내에서 최솟값을 구하는 문제입니다.

 

저의 경우, 슬라이딩 윈도우를 적용하였고, Python을 사용했습니다.

먼저, 주어진 N개의 수를 차례대로 탐색해가며 현재 탐색 중인 수와 덱의 저장된 수들을 뒤에서부터 비교하여, 만약, 덱에 저장되어 있는 수가 더 클 경우 해당 값은 최솟값이 될 수 없으므로 덱에서 전부 빼낸 뒤, 현재 탐색 중인 수를 인덱스와 함께 튜플 형태로 덱에 저장하였습니다.

그 후, 이번에는 덱의 앞 부분부터 저장되어 있는 수의 인덱스가 특정 범위에 해당하지 않을 경우를 체크하여, 만약 해당하지 않는다면 앞으로 전부 빼내어 최종적으로 덱의 맨 앞에 있는 수가 특정 범위 내의 최솟값으로 유지되게 하여 문제를 해결했습니다.


3) 코드

 

* Python 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from collections import deque
import sys
input = sys.stdin.readline
 
N, L = map(int, input().split())
A = list(map(int, input().split()))
dq = deque()
 
for i in range(N):
    while dq and dq[-1][1] > A[i]:
        dq.pop()
    
    dq.append((i, A[i]))
 
    while dq and dq[0][0] < i - L + 1:
        dq.popleft()
        
    print(dq[0][1], end=" ")

 

저작자표시 비영리 변경금지 (새창열림)

'Deprecated' 카테고리의 다른 글

[Baekjoon Online Judge] 백준 1717번 집합의 표현(Python)  (0) 2020.05.16
[Algorithm] 슬라이딩 윈도우  (0) 2020.05.15
[Baekjoon Online Judge] 백준 6198번 옥상 정원 꾸미기(Python)  (0) 2020.05.13
[Baekjoon Online Judge] 백준 11003번 탑(Python)  (0) 2020.05.13
[Algorithm] 투 포인터  (0) 2020.05.13
    'Deprecated' 카테고리의 다른 글
    • [Baekjoon Online Judge] 백준 1717번 집합의 표현(Python)
    • [Algorithm] 슬라이딩 윈도우
    • [Baekjoon Online Judge] 백준 6198번 옥상 정원 꾸미기(Python)
    • [Baekjoon Online Judge] 백준 11003번 탑(Python)
    HelloMinchan
    HelloMinchan
    Though you should not fear failure, You should do your very best to avoid it.

    티스토리툴바