백준14654 스테판 쿼리

문제 링크

  • https://www.acmicpc.net/problem/14654

문제 출처

  • 제1회 천하제일 코딩대회 본선 E번

시간복잡도

  • O(n)

풀이

  1. 가위바위보를 처리하는 vs라는 함수를 만듭니다.
  2. n을 입력받습니다.
  3. 가위바위보 기보(?)를 입력받습니다.
  4. 가위바위보 결과를 구합니다.
  5. 전 판에서 이긴 사람이 또 이기면 cnt++;
  6. 그렇지 않으면 cnt = 1;
  7. 정답은 cnt와 이전 까지의 정답 중 더 큰 값을 줍니다. ( ans = max(ans, cnt) )
  8. 3~6번을 n번 반복합니다.

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> p;

int vs(int a, int b){
	if(a == b) return 0;
	switch(a){
		case 1:
			if(b == 2) return 1;
			if(b == 3) return -1;
			break;
		case 2:
			if(b == 1) return -1;
			if(b == 3) return 1;
			break;
		case 3:
			if(b == 1) return 1;
			if(b == 2) return -1;
	}
}

p arr[301];

int main(){
	int n;
	scanf("%d", &n);
	for(int i=0; i<n; i++){
		scanf("%d", &arr[i].first);
	}
	for(int i=0; i<n; i++){
		scanf("%d", &arr[i].second);
	}
	int win = 0; //최근 승리
	int cnt = 0, ans = 0;
	for(int i=0; i<n; i++){
		int res = vs(arr[i].first, arr[i].second);
		if(res == 0) res = -1*win;
		if(res == win){
			cnt++;
		}
		else{
			cnt = 1;
			win = res;
		}
		ans = max(cnt, ans);
	}
	printf("%d", ans);
}