ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]13422: 도둑 - JAVA
    문제풀이/백준 2021. 8. 4. 14:28

    [백준]13422: 도둑

     

    13422번: 도둑

    입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 마

    www.acmicpc.net

    풀이

    🪑 문제가 장황하게 적혀있지만 한 줄로 정의할 수 있는 문제였다. 간단한 투포인터 문제이다.

     

    📝 문제를 정리해 보자

    • N개의 집들 중에서 M개의 연속된 집을 선택하여 K이하의 돈을 훔칠 수 있는 경우의 수를 구하는 문제이다.

    문제 구현에 대한 아이디어는 굉장히 쉽지만, 엣지 케이스가 있으니 유의해야 한다. 문제가 쉽다고 무턱대고 구현했다가 엣지 케이스에서 걸려버렸다 ㅠ

     

     

    🔧 이제 풀어보자!

    1. 입력 받은 정보를 저장한다. 
    2. 집들은 항상 연속된 M개를 선택해야 하므로 이 크기를 유지한 채로 투포인터를 진행한다.

     

    🔹 입력 받은 정보를 저장한다. 

    - 이때 각각의 집에서 보관중인 돈의 양의 총합도 구해주었다.

     

    🔹 집들은 항상 연속된 M개를 선택해야 하므로 이 크기를 유지한 채로 투포인터를 진행한다.

    - start와 end가 항상 m만큼 차이나도록 하였다. 초기 start와 end만큼의 sum을 구해주는 로직을 추가해 주었다.

    - start가 n보다 작은 동안만 탐색하며, 현재 돈의 합이 k보다 작은지 확인하여 count를 ++한다.

    - 그 다음으로 m의 크기를 유지하여 다음 집을 확인하며 이때 기존의 sum에서 start에 해당하는 집의 값은 빼주고, 추가로 포함될 end에 해당하는 집의 값을 더해준다. end는 n의 크기를 넘을 수 있으므로 나머지 연산을 해주었다.

     

     

    🙋‍♀️ 이 문제에서 발생할 수 있는 엣지 케이스는 다음과 같다!

    더보기

    n과 m이 같을때 n개의 집들이 가진 돈의 총 합이 k 미만이다.

    n과 m이 같을때 n개의 집들이 가진 돈의 총 합이 k 이상이다.

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    import java.io.*;
    import java.util.*;
     
    public class Main {
     
        public static void main(String[] args) throws IOException {
            
            //입력
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
     
            int t = Integer.parseInt(bf.readLine());
            for(int i = 0; i < t; i++) {
                String str = bf.readLine();
                StringTokenizer st = new StringTokenizer(str);
                int n = Integer.parseInt(st.nextToken());
                int m = Integer.parseInt(st.nextToken());
                int k = Integer.parseInt(st.nextToken());
     
                int[] home = new int[n];
                str = bf.readLine();
                st = new StringTokenizer(str);
                int total = 0;
                for(int j = 0; j < n; j++) {
                    home[j] = Integer.parseInt(st.nextToken());
                    total += home[j];
                }
                //입력 끝
     
                if(n == m) {
                    if(total < k) System.out.println("1");
                    else System.out.println("0");
                } else {
                    int count = 0;
     
                    int start = 0;
                    int end = m - 1;
                    int sum = 0;
                    for(int j = 0; j <= end; j++) {
                        sum += home[j];
                    }
     
                    while(start < n) {
                        if(sum < k) count++;
                        sum -= home[start++];
                        sum += home[(++end) % n];
                    }
                    System.out.println(count);
                }
            }
        }
    }
    cs

    댓글

Designed by Tistory.