https://www.acmicpc.net/problem/9324
유형: 순서대로 요소들의 개수를 count해서 특정 조건에 어떤 행위를 하게 하고 싶은데~
문제
스파이들은 사령부와 통신하기 위해서 SMTP(비밀 메시지 전송 프로토콜)를 사용해 비밀 회선으로 전자 메시지를 보낸다. 메시지가 적들에 의해 조작되어 보내진 것이 아닌 진짜 메시지라는 것을 표시하기 위해 모든 메시지는 회선에 노이즈가 있었거나 발신 측에서 손을 떨면서 메시지를 보낸 것처럼 변형되는데, 이 변형 알고리즘은 메시지를 가로채는 자들이 우연히 변형 규칙을 흉내 낼 수 없을 정도로 정교하다. 또한 요원들의 머리에 총구가 겨눠져 강제로 메시지를 말한 경우 간단히 실수를 의도적으로 넣어 이 메시지가 강제로 쓰인 메시지라는 것을 알려줄 수 있다.
알고리즘대로 정확하게 변형된 메시지는 각 문자가 세 번째 등장할 때 한 번 더 문자가 삽입된다. 예를 들면 요원이 "HELLOTHEREWELLBEFINE" 라는 메시지를 보내고 싶어 했다면 "HELLOTHEREEWELLLBEFINEE" 는 정확한 변형이다. 몇 년 동안 이 메시지들의 진짜 여부는 고도로 훈련된 원숭이들이 판별해내었다. 그러나 사령부에 도착하는 메시지들의 양이 많이 늘어나면서 이 작업을 자동으로 처리해주는 프로그램을 고안하기로 하였다.
입력
첫째 줄에 100 이하의 테스트 케이스의 개수가 주어진다. 그리고 각 테스트 케이스마다
- 대문자로만 이루어진 10만자 이하의 문자열 M이 한 줄에 주어진다. 이 문자열은 검사해야할 메시지다.
출력
테스트 케이스마다
- 메시지 M이 진짜 메시지면 “OK”를, 가짜 메시지면 “FAKE”를 한 줄에 출력한다.
예제 입력 1 복사
3
BAPC
AABA
ABCABCBBAAACC
예제 출력 1 복사
OK
FAKE
OK
--코드
--코드 설명
가장 중요했던 포인트: 글자를 앞에서부터 count 하고 3개가 되었을 때 조건을 처리해줄 것
처음에는 새로운 문자열 리스트를 만들어서 비교해려고 했는데 삽질이었다.
먼저 ord를 사용해서 아스키코드로 접근했고, 0이 담긴 A~Z 까지의 리스트를 만들어주었다
-> 굳이 defaultdict 같은 것들을 사용할 필요 없게 만들어버렸다!
후에 i를 index로 접근하면서 누적 count가 3 이 되었을 때,
마지막 글자이거나, 다음 인덱스의 글자가 본인과 같지 않을 때, fake로 처리해준다
flag는 탐색의 필요성을 나타내는 것으로 보면 된다
26번줄은 3번 count 가 완료되었으면 다시 0으로 돌려주는 것을 의미한다
'알고리즘' 카테고리의 다른 글
[백준 1051- 숫자 정사각형][파이썬] (0) | 2022.09.12 |
---|---|
[알고리즘 챌린지 31일 정리] (0) | 2022.06.27 |
[백준 2606- 바이러스][파이썬]-31일차 (0) | 2022.06.26 |
[백준 1753- 최단경로][파이썬]-30일차 (0) | 2022.06.25 |
[백준 7576- 토마토][파이썬]-30일차 (0) | 2022.06.25 |