카테고리 없음

[CodeForces] 코드포스 Typical Interview problem 문제풀이(C++)

도리컴 2023. 10. 19. 17:46
반응형

FB-String이 "FBFFBFFB"가 무한반복 된다는 것을 떠올리면 됨

 -> 크게 어렵진 않지만, 이유를 아는 것이 중요

 

* 1부터 시작해서 숫자를 올리며 추가하다 보면, 3과 5의 최소공배수인 15인 경우가 발생하는데, 이 이후부터는 패턴이 반복되므로 위 문자열 무한반복

 

처음 숫자 : 1 -> 아무것도 안함

숫자 : 2 -> 아무것도 안함

숫자 : 3 -> "F" 추가

숫자 : 4 -> 아무것도 안함

숫자 : 5 -> "B" 추가 -> "FB"

숫자 : 6 ->  "F" 추가 -> "FBF"
숫자 : 7, 8 -> 아무것도 안함

숫자 : 9 -> "F"추가 -> "FBFF"

숫자 : 10 -> "B"추가 -> "FBFFB"

숫자 : 11 -> 아무것도 안함

숫자 : 12 -> "F"추가 -> "FBFFBF"

숫자 : 15 -> "F", "B"추가 -> "FBFFBFFB"

 

16 이후부터는 위의 과정 반복 -> "FBFFBFFB" 반복

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
#include<iostream>
#include<cstring>
#include<vector>
#include<string>
using namespace std;
 
/*
<문제> 2초, 512메가
FB-string 처음엔 비어있고, 양수로 채움
1부터 오름차순으로
3으로 나누어떨어지면 F을 FB-string에 추가
5로 나누어 떨어지면, B를 FB-string에 추가
둘 다 나누어떨어지면 "FB"를 추가 
 
F/B로 이루어진 문자열을 받았을 때, 
이것이 FB-string인지를 판별
즉, 이 문자열이 l~r까지의 FB-string인지룰 판별
 
<입력>
t    테스트케이스(~2046)
각 테스트케이스마다 두 줄
k     FB-문자열 수(<=10)
s    FB-문자열
 
<출력>
YES 또는 NO(각 테스트케이스마다)
 
<풀이>
이게 FBFFBFFB가 계속 반복됨
즉, 주어진 문자열 1~10개를 위 문자열 세 번 나열한 것에서 찾아보면 됨
-> KMP가면 되겠지만, 라이브러리 이용
 
*/
 
int main() {
    int t; cin >> t;
    string origin = "FBFFBFFBFBFFBFFBFBFFBFFB";
 
    while (t--) {    //testcase
        int k; string s; cin >> k >> s;    //문자열 수, 문자열
        if (origin.find(s) == -1) cout << "NO" << endl;
        else cout << "YES" << endl;
    }
    return 0;
}
cs

반응형