청야에몽
청야의 개발 일기
청야에몽
전체 방문자
오늘
어제
  • 분류 전체보기 (155) N
    • os (4)
      • Linux (4)
    • Language (32)
      • Python (15)
      • C# (6)
      • Java (11)
    • BaekJoon (92)
      • 단계별로 풀어보기 (81)
      • 누적합 (11)
    • Test (6)
      • 코딩테스트 (6)
      • 42 SEOUL (0)
    • Project (9)
      • 충돌, 피하기 게임 (8)
      • Unreal engine5 CICD 구축 (1)
    • Git & GitHUB (9)
    • Cloud (2) N
      • AWS (0)
      • Azure (0)
      • Docker (2) N

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c#
  • pygame
  • 파이썬
  • 재귀 함수
  • 백준
  • Reset
  • 중첩for문
  • git
  • 누적 합
  • 연산자
  • Linux
  • 리눅스
  • for문
  • Rebase
  • Revert
  • Python
  • 자료형
  • docker
  • java
  • 누적합

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
청야에몽

청야의 개발 일기

[백준] 블로그 - 21921번 문제 (Python)
BaekJoon/누적합

[백준] 블로그 - 21921번 문제 (Python)

2023. 3. 31. 11:50
728x90

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

 

21921번: 블로그

첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다

www.acmicpc.net


문제

찬솔이는 블로그를 시작한 지 벌써 N일이 지났다.

요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

찬솔이는 X일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.

찬솔이를 대신해서 X일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.

입력

첫째 줄에 블로그를 시작하고 지난 일수 N와 X가 공백으로 구분되어 주어진다.

둘째 줄에는 블로그 시작 1일차부터 N일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.

출력

첫째 줄에 X일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.

만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.

제한

  •  1 ≤ X ≤ N ≤ 250,000
  •  0 ≤ 방문자 수 ≤ 8,000 

코드 정답

import sys
input = sys.stdin.readline

# 21921
n, x = map(int, input().split())
if (not (1 <= x <= n <= 250000)):
    exit()
li = list(map(int, input().split()))

if max(li) == 0:
    print("SAD")
else:
    li_num = sum(li[0:x])
    value = li_num
    cnt = 1
    for i in range(x, n):
        value -= li[i-x]
        value += li[i]
        if value > li_num:
            li_num = value
            cnt = 1
        elif value == li_num:
            cnt += 1
    print(li_num)
    print(cnt)

풀이

input보다 빠른 sys.stdin.readline을 사용하기 위해 아래와 같은 코드를 작성합니다. 저렇게 한다면 input으로 sys.stdin.readline의 효율을 낼 수 있습니다.

import sys
input = sys.stdin.readline

띄워쓰기를 기준으로 정수값 두 개를 입력받아 각각 변수 n과 x에 대입합니다. 조건에 알맞지 않으면 코드가 종료가 됩니다. 이후 띄워쓰기를 기준으로 정수값 n개를 입력받아 그것을 각각의 인덱스에 저장하여 변수 li에 리스트 형식으로 저장합니다.

n, x = map(int, input().split())
if (not (1 <= x <= n <= 250000)):
    exit()
li = list(map(int, input().split()))

만약 li에 저장되어 있는 값 중에서 가장 큰 값이 0일 경우 SAD가 출력되고 코드는 종료됩니다.

if max(li) == 0:
    print("SAD")

가장 큰 값이 0이 아닐 경우 li의 인덱스 번호 0번부터 x-1번까지를 더하고 그 값을 li_num변수에 저장합니다. 이후 변수 value에 li_num을 저장합니다. cnt란 변수에 값을 1을 저장합니다.

else:
    li_num = sum(li[0:x])
    value = li_num
    cnt = 1

x값부터 n값이 될 때까지 그 값을 i에 저장하며 반복을합니다. 반복일 될 때마다 value = value - li[i-x]와 value = value + li[i]를 해줍니다. 이후 value에 저장되어 있는 값이 li_num보다 클 시 li_num에 value값을 저장해주고 cnt의 값은 1로 바꿔주고서 반복문을 돕니다. 만약 value 값이 li_num 값과 같을 시에는 cnt의 값을 1 증가시킨 후 반복문을 돕니다.

    for i in range(x, n):
        value -= li[i-x]
        value += li[i]
        if value > li_num:
            li_num = value
            cnt = 1

반복문에서 빠져나오게 된다면 li_num과 cnt의 값을 출력하게 됩니다.

    print(li_num)
    print(cnt)
728x90
저작자표시 비영리 변경금지 (새창열림)

'BaekJoon > 누적합' 카테고리의 다른 글

[백준] 부분합 - 1806번 문제 (Python)  (0) 2023.04.01
[백준] 합 구하기 - 11441번 문제 (Python)  (0) 2023.03.30
[백준] 순서쌍의 곱의 합 - 13900번 문제 (Python)  (0) 2023.03.26
[백준] Maximum Subarray - 10211번 문제 (Python)  (0) 2023.03.24
[백준] 2차원 배열의 합 - 2167번 문제 (Python)  (0) 2023.03.23
    'BaekJoon/누적합' 카테고리의 다른 글
    • [백준] 부분합 - 1806번 문제 (Python)
    • [백준] 합 구하기 - 11441번 문제 (Python)
    • [백준] 순서쌍의 곱의 합 - 13900번 문제 (Python)
    • [백준] Maximum Subarray - 10211번 문제 (Python)
    청야에몽
    청야에몽
    개인적으로 학습을 하여 까먹지 않기 위해 올리는 블로그입니다.

    티스토리툴바