fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 33575 (C++) 시간표
최초 업로드: 2025-10-01 20:07:50
최근 수정 시간: 2025-10-01 20:07:50
게시자: rlatjwls3333
카테고리: 백준
조회수: 4
# [Silver IV] 시간표 [문제 링크](https://www.acmicpc.net/problem/33575) ## 문제 설명 <p>디미고에 입학한 동현이는 고등학교 인생 첫 시간표를 받게 되었다. 누구나 그렇듯이 동현이도 좋아하는 과목과 싫어하는 과목이 있다. 동현이는 시간표에 자신이 좋아하는 과목이 많을수록 기분이 좋아진다. 학생마다 수업 시간표에 과목들이 어떻게 배치되어 있느냐에 따라 선호도가 달라지는데, 동현이의 시간표 선호도는 다음과 같은 방법으로 계산할 수 있다.</p> <ul> <li>동현이의 시간표 선호도 기본값은 $0$이다.</li> <li>동현이가 좋아하는 과목이 $3$교시 이상 연속으로 등장할 경우 선호도가 연속으로 등장한 과목의 개수만큼 증가한다.</li> <li>동현이가 싫어하는 과목이 $3$교시 이상 연속으로 등장할 경우 선호도가 연속으로 등장한 과목의 개수만큼 감소한다.</li> </ul> <p>동현이가 좋아하는 과목과 싫어하는 과목이 주어질 때 동현이의 시간표 선호도를 출력하는 프로그램을 작성하시오. 각 과목은 $1$부터 $M$ 사이의 정수로 표현된다.</p> ## 입력 <p>첫 번째 줄에 시간표의 길이 $N$, 과목의 개수 $M$, 동현이가 좋아하는 과목의 개수 $A$, 동현이가 싫어하는 과목의 개수 $B$가 공백으로 구분하여 주어진다. $(3 \le N, M \le 10^5; 1 \le A, B < M; A+B \le M)$</p> <p>두 번째 줄에 시간표 $T_1, T_2, \cdots, T_N$이 순서대로 공백으로 구분하여 주어진다. $(1 \le T_1, T_2, \cdots, T_N \le M)$</p> <p>세 번째 줄에 동현이가 좋아하는 서로 다른 $A$개의 과목 $L_1, L_2, \cdots, L_A$이 공백으로 구분하여 주어진다. $(1 \le L_1, L_2, \cdots, L_A \le M)$</p> <p>네 번째 줄에 동현이가 싫어하는 서로 다른 $B$개의 과목 $H_1, H_2, \cdots, H_B$가 공백으로 구분하여 주어진다. $(1 \le H_1, H_2, \cdots, H_B \le M)$</p> <p>동현이가 좋아하면서 동시에 싫어하는 과목은 없으며, 좋아하지도 싫어하지도 않는 과목이 존재할 수 있다.</p> ## 출력 <p>첫 번째 줄에 동현이의 시간표 선호도를 출력한다.</p> ## 풀이 좋아하는 과목을 1, 싫어하는 과목을 -1, 그렇지 않은 과목을 0으로 두면 쉽게 구현할 수 있습니다. ``` c++ #include<bits/stdc++.h> using namespace std; const int MAX = 100'001; int t[MAX], like[MAX]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, a, b; cin >> n >> m >> a >> b; for(int i=0;i<n;i++) cin >> t[i]; while(a--) { int l; cin >> l; like[l]=1; } while(b--) { int h; cin >> h; like[h]=-1; } int sum=0, last=0; for(int i=0;i<n;i++) { if(last==0 || last*like[t[i]]>0) { last += like[t[i]]; } else { if(abs(last)>=3) sum += last; last = like[t[i]]; } } if(abs(last)>=3) sum += last; cout << sum; } ```