-
[백준 15831] 준표의 조약돌 (Python)Algorithm & Problem Solving/투 포인터(Two Pointer) 2021. 1. 5. 10:52
문제풀이
N, B, W, arr : 입력값
w_cnt, b_cnt : 현재 수열에서 W와 B의 개수
q : 현재 수열
다른 투 포인터(Two-Pointer) 문제와 큰 차이 없는 문제였지만, 예외 케이스를 처리해줘야 하는 문제였다.
6 0 0
BBBBBB
위와 같은 테스트케이스에서 q(현재 수열)에 들어갈 수 있는 값이 존재하지 않는데, q.popleft() 하기 떄문에 런타임 에러가 났다.
1. 현재 수열에서 'B' 의 개수가 B 일때 까지 right 를 증가시키면서 q(현재 수열)에 원소를 삽입한다.
- b_cnt == B 인데, 추가로 arr[right] == B 이면 조건에 위배되므로 break를 해준다.
2. b_cnt <= B 이고 w_cnt >= W 이면 ans를 갱신한다.
3. 위에서 언급한 테스트케이스와 같은 경우의 예외처리를 해준다.
- q가 비어있기 때문에 곧바로 left, right를 1 증가해준다.
4. 3이 아닐 경우, 수열에서 가장 좌측의 값을 빼주고 해당하는 색상의 개수를 줄여준다.
코드
import sys from collections import deque if __name__ == '__main__': N, B, W = map(int, sys.stdin.readline().split()) arr = list(map(str, sys.stdin.readline().rstrip())) left, right = 0, 0 w_cnt, b_cnt = 0, 0 q = deque() ans = 0 while left < N and right < N: while right < N and b_cnt <= B: if b_cnt == B and arr[right] == 'B': break if arr[right] == 'B': b_cnt += 1 else: w_cnt += 1 q.append(arr[right]) right += 1 if b_cnt <= B and w_cnt >= W: ans = max(ans, len(q)) if not q: # B 가 0 이고 BBBBB 와 같이 B가 연속적으로 들어오는 예외 상황 처리 left += 1 right += 1 continue x = q[0] if x == 'B': b_cnt -= 1 else: w_cnt -= 1 q.popleft() left += 1 print(ans)
결과
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!
'Algorithm & Problem Solving > 투 포인터(Two Pointer)' 카테고리의 다른 글
[백준 10025] 게으른 백곰 (Python) (1) 2021.01.06 [백준 1253] 좋다 (Python) (0) 2021.01.05 [백준 20366] 같이 눈사람 만들래? (Python) (0) 2021.01.05 [백준 13422] 도둑 (Python) (0) 2021.01.05 [백준 13144] List of Unique Numbers (Python) (0) 2021.01.05