PS/Java

[백준 18917] 수열과 쿼리 38

siyamaki 2025. 2. 24. 10:21

수열과 쿼리 문제중에 아마 접근 아이디어가 가장 쉬운 문제가 아닐까 싶습니다.

 

문제 내용은 아주 단순합니다.


처음에 0이 하나 포함되어있는 배열 A가 있다. 이때, 다음 쿼리를 수행해야 한다.

  • 1 x: A의 가장 뒤에 x를 추가한다.
  • 2 x: A에서 x를 제거한다. A에 x가 두 개 이상 있는 경우에는 가장 앞에 있는 하나만 제거한다. 항상 A에 x가 있는 쿼리만 주어진다.
  • 3: A에 포함된 모든 원소를 더한 값을 출력한다.
  • 4: A에 포함된 모든 원소를 XOR한 값을 출력한다.

여기서 봐야할 건 "포함된 모든 원소" 라는 내용입니다.

 

평소 수열과 쿼리 문제에서 요구하는 건 어떠한 배열이 주어질 때 i ~ j 구간에서 요구하는 합계나 최댓값 등 세그먼트 트리를 이용해야 했습니다.

 

하지만 모든 원소를 구하라 했으니 문제가 매우 단순해집니다.

 

모든 원소를 더한 값 = 입력 될 때마다 누적 합

모든 원소를 XOR한 값 = 입력 될 때마다 XOR 수행

으로 표현됩니다. x의 갯수가 최대 50만, 범위가 0 ~ 10억까지니 long형으로 처리해야 합니다.

 

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int M = Integer.parseInt(br.readLine());
        long getSum = 0;
        long getXor = 0;
        while(M-->0) {
            int c = Integer.parseInt(br.readLine());
            if(c == 1) {
                long x = Long.parseLong(br.readLine());
                getSum += x;
                getXor ^= x;
            } else if(c == 2) {
                long x = Long.parseLong(br.readLine());
                getSum -= x;
                getXor ^= x;
            } else if(c == 3) {
                bw.write(Long.toString(getSum));
                bw.newLine();
            } else if(c == 4) {
                bw.write(Long.toString(getXor));
                bw.newLine();
            }
        }
        bw.flush();
        bw.close();
        br.close();
    }
}