[백준14465] 소가 길을 건너간 이유 5

2021. 5. 5. 17:45·알고리즘 문제풀이

www.acmicpc.net/problem/14465

 

14465번: 소가 길을 건너간 이유 5

첫 줄에 N, K, B (1 ≤ B,K ≤ N)가 주어진다. 그 다음 B줄에는 고장난 신호등의 번호가 하나씩 주어진다.

www.acmicpc.net

 

import sys
input = sys.stdin.readline

N,K,B = map(int,input().split())

arr = [0]*(N+1)

for i in range(B):
    arr[int(input())] = 1

s=[]
cnt = 0
for i in range(N+1):
    cnt+=arr[i]
    s.append(cnt)

answer = B
for i in range(N+1-K):
    answer = min(answer,s[i+K] - s[i])

print(answer)

풀이1 (누적합)

연속하는 K 개의 신호등을 만들 수 있는 신호등의 수

 

arr[n] = 0~n까지 신호등 수를 기록하는 부분합 배열을 만든다.

 

k ~ n 까지 진행하면서 arr[n] - arr[n-k] 가 최소인 값을 찾는다.

 

시간 복잡도

누적합으로 구하지 않고 각 영역(1~6,2~7...)을 sum(1:6) 같은 코드를 사용해서 구현했다면

연속되는 범위가 k라고 할때 합을 구할 때 O(k)가 발생한다.

합을 구하는 연산이 O(N)번 일어나서 O(kN) 이 될 것이다.

 

부분합 이용해 합을 구하는 과정을 O(1)로 줄일 수 있고 그것을 N번 수행하니

시간복잡도는 O(N)이다.

 

import sys
input = sys.stdin.readline

N,K,B = map(int,input().split())

arr = [0]*(N+1)

for i in range(B):
    arr[int(input())] = 1

s,e = 1,K
total = sum(arr[s:e+1])

answer = B
while True:
    if arr[s] == 1:
        total-=1
    e+=1
    s+=1

    if e == N+1:
        break

    total += arr[e]

    answer = min(total,answer)

print(answer)

풀이2 (슬라이딩 윈도우)

k의 크기를 가진 슬라이드를 만든다.

 

나는 s,e를 지정해 슬라이드 시작지점과 끝지점의 인덱스를 구해주었다.

 

먼저 시작지점의 고장난 신호등의 수(total)를 구한다.

 

시작지점(s)과 끝지점(e)을 구간의 끝까지 1씩 더하며 최솟값을 찾는다.

 

시작지점이 고장난 신호등 이었다면 1을 빼주고 추가되는 인덱스가 고장난 신호등이라면 1을 더해주면 된다.

 

시간복잡도

0~N+1 구간을 슬라이딩 윈도우로 한번 진행하면 답을 구할 수 있다.

즉 O(N) 이다.

 

 

 

'알고리즘 문제풀이' 카테고리의 다른 글

[2019 카카오 개발자 겨울 인턴십] 불량 사용자  (0) 2021.05.05
[백준1238] 파티  (0) 2021.05.05
[백준1747] 소수&팰린드롬  (0) 2021.05.05
[백준2872] 우리집엔 도서관이 있어  (0) 2021.05.05
[백준3980] 선발 명단  (0) 2021.05.05
'알고리즘 문제풀이' 카테고리의 다른 글
  • [2019 카카오 개발자 겨울 인턴십] 불량 사용자
  • [백준1238] 파티
  • [백준1747] 소수&팰린드롬
  • [백준2872] 우리집엔 도서관이 있어
WildDevmon
WildDevmon
『앗! 야생의 개발몬(이)가 나타났다!』
  • WildDevmon
    야생의 개발몬
    WildDevmon
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • Server (5)
      • 알고리즘 문제풀이 (27)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코틀린 코루틴
    백준 18405
    1114백준
    백준1188
    다이렉트 버퍼
    네카라쿠배 취업
    자바 최소공배수
    preStop
    백준1238
    백준 1034
    백준 1027
    자바 스레드 상태
    2020 카카오 인턴
    ai개발자
    백준 1114
    파이썬
    선발 명단
    백준 1004
    자바 프로세스 종료
    백준 고층 건물
    소가 길을 건너간 이유 5
    자바 최대공약수
    카카오 필요스펙
    백준 램프
    백준15954
    백준 어린 왕자
    백준 인형들
    graceful shutdown
    direct buffer
    네이티브 메모리
    백준1747
    백준 1114 파이썬
    백준6980
    우아한 종료
    자바 물리 메모리
    백준 30
    백준 파티
    커널 스레드 상태
    백준 5347
    백준 10610
    백준2262
    경력 서류
    통나무 자르기
    백준 17281
    백준 경쟁적 전염
    소수&팰린드롬
    백준14465
    컴공 취준
    합승 택시 요금
    terminationGracePeriodSeconds
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
WildDevmon
[백준14465] 소가 길을 건너간 이유 5
상단으로

티스토리툴바