[BOJ] 백준 2531. 회전초밥 (+15961. 회전초밥)

2024. 3. 28. 17:51· Java/BOJ

문제

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

 

2531번: 회전 초밥

첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤

www.acmicpc.net


풀이

 슬라이딩 윈도우 문제입니다. N의 input size가 30,000이기 때문에 for 문을 2번 돌게 되면 시간 제한 1초를 넘기게 됩니다. 

 

 관건은 초밥의 개수가 아닌 종류를 세야하는 것인데, 이는 Map 자료형을 통해 해결했습니다. map에서 key를 초밥의 종류로, value를 종류 당 개수로 지정해주고, 종류 카운트는 map.size를 통해 세어주었습니다. 여기서 만약 value가 0이라면 map에서 제거했습니다.

 

 그리고 배열의 크기를 N+k-1의 크기로 지정해주어, 회전하는 배열을 구현했습니다. 회전 배열임으로, N에서부터 스시를 선택하면 다시 돌아와 k-1만큼 더한 값만큼을 고려해주어야 하기 때문입니다.

 

아래는 해당 풀이입니다.


소스코드

import java.util.*;

public class B2531_회전초밥 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int d = sc.nextInt();
        int k = sc.nextInt();
        int c = sc.nextInt();
        int[] sushis = new int[N+k-1];

        for(int i = 0;i<N;i++){
            sushis[i] = sc.nextInt();
        }
        for(int i = N;i<N+k-1;i++){
            sushis[i] = sushis[i-N]; // 회전배열 필요값만큼만 정의
        }

        Map<Integer, Integer> map = new HashMap<>();
        for(int i=0;i<k;i++){
            map.put(sushis[i], map.getOrDefault(sushis[i],0)+1);
        }
        map.put(c, map.getOrDefault(c,0)+1);
        int max = map.size();

        for(int ed=k;ed<N+k-1;ed++){
            int cnt;
            int st = ed-k;
            int out = sushis[st];
            
			//1. 나가는 초밥 빼기
            map.put(out,map.get(out)-1); 
            if(map.get(out)==0) map.remove(out); //나가는 초밥이 만약 0이면 map에서 제외
			
            //2. 추가된 초밥 넣기
            int in = sushis[ed];
            map.put(in, map.getOrDefault(in,0)+1); 
            
            //3. 쿠폰 번호 넣기
            map.put(c, map.getOrDefault(c,0)+1); 

            cnt = map.size();
            max = Math.max(cnt, max);

        }
        System.out.println(max);
    }
}

 

 

 


+

위 풀이를 아래 문제에도 똑같이 적용해 해결할 수 있습니다. 

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

 

15961번: 회전 초밥

첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 3,000,000, 2 ≤ d ≤ 3,000, 2

www.acmicpc.net

 

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 17281. 야구  (0) 2024.04.02
[BOJ] 백준 24042. 횡단보도  (0) 2024.03.30
[BOJ] 백준 21921. 블로그  (0) 2024.03.27
[BOJ] 백준 4386. 별자리 만들기  (0) 2024.03.25
[BOJ] 백준 19949. 영재의 시험  (0) 2024.03.21
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 17281. 야구
  • [BOJ] 백준 24042. 횡단보도
  • [BOJ] 백준 21921. 블로그
  • [BOJ] 백준 4386. 별자리 만들기
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 큐
  • JCF
  • OS
  • 한양대
  • 프로그래머스
  • 김영한
  • 반효경
  • 운영체제
  • 자바
  • Java
  • 인프런
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 스택
  • 네트워크
  • 이석복
  • 구현
  • 레디스
  • BOJ
  • 백준
  • 자바스크립트

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 2531. 회전초밥 (+15961. 회전초밥)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.