Dlise
시원한 냉장고
Dlise
전체 방문자
오늘
어제
  • 시원한 냉장고 (136)
    • Java (31)
      • Java (26)
      • Spring (5)
    • Algorithm & PS (25)
      • Algorithm (14)
      • Problem Solving (11)
    • Network (12)
    • Database (2)
    • Data Structure (4)
    • OOP & CleanCode (5)
    • Web (0)
    • Git (2)
    • AI (2)
    • Project (1)
      • Discord Bot (1)
    • Error (19)
    • Tools (5)
    • 수학 (5)
      • 확률과 통계(기초) (5)
    • 컴퓨터 구조 (3)
    • 활동 (20)
      • 행사 & 여행 (10)
      • 자격증 (4)
      • 회고 (6)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 통계학
  • 중위 표기법
  • java
  • 네트워크
  • 열혈강의자료구조
  • CleanCode
  • 후위 표기법
  • 백준
  • 가장쉬운알고리즘책
  • spring security in action second edition

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Dlise

시원한 냉장고

Algorithm & PS/Problem Solving

백준 - 4097. 수익

2025. 5. 15. 20:07

알고리즘과 자바에 대해 다시 상기시키고 싶어서 다시 PS를 시작하고자 한다.

 

4097. 수익

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

 

문제

 

설명

첫째 줄에 N, 둘째 줄부터 N개의 줄엔 수익 P가 주어진다. 범위는 N은 250,000까지, P는 -10,000 ~ 10,000까지이다.

다만 테스트 케이스 개수는 정해지지 않아서 O(N)에 구현하는 것을 목표로 고민했다.

 

접근 1

구간에 대해 가장 큰 값을 구하는 것은 어렵지 않았다. 합이 음수가 되는 순간 가장 큰 값이 아니게 되기 때문이다.

고민했던 부분은 구간이 비어있으면 안 된다는 조건이다.

 

반목문을 통해 값을 더해갔는데, 최초 값을 반복문 밖으로 빼서 받을지, 첫 입력인지에 대한 Flag를 둘지 고민했고, 후자로 결정했다. 

 

풀이 코드

import java.io.*;

public class Main {
    static BufferedReader br;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int input;
        while ((input = Integer.parseInt(br.readLine())) != 0) {
            sb.append(getMaxValue(input)).append('\n');
        }
        System.out.print(sb);
    }

    private static int getMaxValue(int size) throws IOException {
        boolean isFirst = true;
        int max = 0;
        int sum = 0;

        while (size-- > 0) {
            int current = Integer.parseInt(br.readLine());
            sum += current;

            if (max < sum || isFirst) {
                max = sum;
                isFirst = false;
            }

            if (sum < 0) {
                sum = 0;
            }
        }
        return max;
    }
}

 

나름 Java 풀이 중 높은 등수라서 만족했다.

 

접근 2

문제 풀이 후 글을 작성하면서 다른 방법이 떠올랐다.

P의 최솟값이 -10,000이므로 max를 이보다 더 작게 초기화하면 Flag가 필요 없어지는 것이다.

아래 코드와 같이 `isFirst` 를 없애고 max를 -10001로 초기화했다.

 

풀이 코드

import java.io.*;

public class Main {
    static BufferedReader br;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int input;
        while ((input = Integer.parseInt(br.readLine())) != 0) {
            sb.append(getMaxValue(input)).append('\n');
        }
        System.out.print(sb);
    }

    private static int getMaxValue(int size) throws IOException {
        int max = -10001;
        int sum = 0;

        while (size-- > 0) {
            int current = Integer.parseInt(br.readLine());
            sum += current;

            if (max < sum) {
                max = sum;
            }

            if (sum < 0) {
                sum = 0;
            }
        }
        return max;
    }
}

 

결과는 더 느리다..? 흠..

 

'Algorithm & PS > Problem Solving' 카테고리의 다른 글

백준 - 12100. 2048 (Easy)  (0) 2024.08.22
백준 - 11003. 최솟값 찾기  (1) 2024.07.01
백준 - 14938. 서강그라운드  (0) 2024.06.25
백준 - 9663. N-Queen  (0) 2024.06.25
백준 - 18405. 경쟁적 전염  (0) 2024.06.19
    'Algorithm & PS/Problem Solving' 카테고리의 다른 글
    • 백준 - 12100. 2048 (Easy)
    • 백준 - 11003. 최솟값 찾기
    • 백준 - 14938. 서강그라운드
    • 백준 - 9663. N-Queen
    Dlise
    Dlise

    티스토리툴바