Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디
- 그래프 이론
- 브루트포스
- 누적합
- 다이나믹 프로그래밍
- 구현
- GROUP BY
- 크루스칼
- 에라토스테네스의 체
- 재귀
- DP
- 분할정복
- 그래프 탐색
- 플로이드-워셜
- 트리
- 다시
- 서브쿼리
- join
- 백트래킹
- DFS
- 해시
- 다익스트라
- 우선순위큐
- BFS
- MST
- 투포인터
- 자료구조
- 시뮬레이션
- 다이나믹프로그래밍
- 수학
Archives
- Today
- Total
기록하고 까먹지 말기
5525 본문
날짜 : 2023. 02. 06
사용 언어 : python
문제
코드
import sys
n = int(sys.stdin.readline()) # OI 개수
m = int(sys.stdin.readline()) # 문자열 길이
s = sys.stdin.readline().rstrip() # 문자열
res = 0
now, cnt = 0, 0 # now : 현재 기준점 / cnt : 연속성 체크용
while now < (m - 1):
if s[now:now + 3] == "IOI": # IOI인 경우
cnt += 1 # 연속 체크
now += 2 # 2칸 이동
if n == cnt:
res += 1
cnt -= 1 # 맨 앞 IOI 삭제(찾았으니까 필요 x)
else:
cnt = 0
now += 1
print(res)
풀이
- 문자열 슬라이싱으로 하나씩 비교하다보면 시간복잡도가 O(n * m)으로 나타나기 때문에 결국 TLE가 발생한다(50점)
- 그래서 시간복잡도를 줄이기 위해 문자열 슬라이싱을 사용하기보다는 "IOI"를 비교하면서 연속된 경우를 체크하면서 연속된 횟수가 기준이 되는 IOI의 개수와 동일한 경우에 결과값을 중가시키는 방향으로 코드를 전개한다.
- 또한 기준점이 "O"인 경우에는 기준 문자열과는 다를 것이기 때문에 비교를 하지 않고 넘어간다.
- 또한 연속되는게 끊길 경우에도 연속되는 개수(cnt)를 0으로 초기화함으로써 처음부터 셀 수 있도록 설정한다.
알게된 점
- 50점은 쉽게 얻었는데 이중 반복문을 계속 생각하다보니 정답이 곧바로 연상되지 않았다.
- 식을 세워서 풀어보려 하기도 했고, for문 안에서 "I"를 발견했을 때만 for문을 넣어 비교하는 방식으로 풀어보려 했지만 계속 TLE가 발생했다.
- 결국 한시간정도 고민하고 찾아보니 연속되는 개수를 가산 / 0으로 초기화하면서 문제를 해결하는 것이 골자였다.
(해당 풀이를 사용했을 때의 시간복잡도는 O(3 * m))
참고 사이트
-