[백준] List of unique numbers 13144

오늘내일·2024년 7월 10일
0

이 문제는 풀기가 어려워 구글에 검색하여 여러 블로그를 살펴봤다. 여러 블로그를 살펴봤지만 직관적으로 이해가 되는 풀이는 아래 블로그여서 아래 블로그의 풀이를 참조하였다.
https://connie.tistory.com/20
간략하게 설명하자면 연속된 수열을 뽑을 수 있는 전체 경우의 수에서 투포인터로 배열을 확인하며 될 수 없는 경우의 수를 빼줬다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class ListOfUniqueNumbers_13144_2 {
  // 길이가 N인 수열, 수열에서 연속한 1개 이상의 수를 뽑았을 때 같은 수가 여러번 등장하지 않는 경우의 수를 구하라
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    StringTokenizer st = new StringTokenizer(br.readLine());
    int[] input = new int[n];
    long result = 0;
    for (int i = 0; i < n; i++) {
      input[i] = Integer.parseInt(st.nextToken());
      // 전체 경우의 수를 직접 더해서 구한다.
      result += i + 1;
    }

    int left = 0;
    int right = 0;
    int[] numbers = new int[100001];

    while (left <= right && right < n) {

      int count = numbers[input[right]] + 1;

      if (count != 2) {
        numbers[input[right]]++;
        right++;
      } else {
        // 중복되는 수가 있어서 아래 경우의 수만큼 전체 경우의 수에서 제외한다.
        result -= n - right;

        numbers[input[left]]--;
        left++;
      }

    }

    System.out.println(result);
  }
}
profile
다시 시작합니다.

0개의 댓글