Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

[백준 20922 - Node.js] 겹치는 건 싫어
연습장/백준(BOJ) 문제풀이

[백준 20922 - Node.js] 겹치는 건 싫어

2023. 1. 10. 03:58

🔗 문제 링크

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

 

20922번: 겹치는 건 싫어

홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열

www.acmicpc.net

✏️ 풀이

const input = require('fs')
  .readFileSync('/dev/stdin')
  .toString()
  .trim()
  .split('\n');
const [[N, K], arr] = input.map(v => v.split(' ').map(Number));

const intMap = {};
let maxLength = 0;
let i = 0;
let j = 0;

while (i <= j && j < N) {
  while (intMap[arr[j]] === K) {
    intMap[arr[i]]--;
    i++;
  }
  maxLength = Math.max(maxLength, j - i + 1);
  intMap[arr[j]] = (intMap[arr[j]] ?? 0) + 1;
  j++;
}

console.log(maxLength);

 

arr[i]를 수열의 첫 번째 원소, arr[j]를 수열의 마지막 원소라고 할 때, j를 증가시키면서 intMap에 각 수가 등장한 횟수를 갱신한다.

 

j를 증가시키기 전에 먼저 arr[j]에 해당하는 수가 이미 수열에 몇 번 등장하는지 확인하여 만약 그 수가 K개라면 arr[j]를 포함시키면 K + 1개가 되어 문제의 조건인 "같은 원소가 K개 이하"임을 만족하지 못하게 된다. 따라서 arr[j]를 수열에 포함시키기 전에 i를 계속 증가시키면서 arr[j]와 동일한 수가 수열에서 한 번 제거될 때까지 arr[i]를 수열에서 제거한다.

 

j가 N - 1일 때까지 반복하면서 조건을 만족하는 부분 수열의 길이를 매번 갱신하면 반복문이 끝날 때의 maxLength가 정답이 된다.

저작자표시 비영리 (새창열림)

'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글

[백준 1806 - Node.js] 부분합  (0) 2023.01.11
[백준 15565 - Node.js] 귀여운 라이언  (0) 2023.01.11
[백준 2531 - Node.js] 회전 초밥  (1) 2023.01.09
[백준 2230 - Node.js] 수 고르기  (0) 2023.01.06
[백준 6588 - Node.js] 골드바흐의 추측  (0) 2023.01.05
    '연습장/백준(BOJ) 문제풀이' 카테고리의 다른 글
    • [백준 1806 - Node.js] 부분합
    • [백준 15565 - Node.js] 귀여운 라이언
    • [백준 2531 - Node.js] 회전 초밥
    • [백준 2230 - Node.js] 수 고르기
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바