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
- Flutter
- 알고리즘
- 99클럽
- 파이썬 코테
- 코딩테스트
- 백준
- c++ 코테
- Python
- ML
- 파이썬
- 코테
- DP
- til
- Laravel
- 개발자 취업
- 뷰
- 코딩테스트 준비
- flutter getx
- C++
- 라라벨
- 개발자취업
- 안드로이드
- 플러터
- 티스토리챌린지
- 항해99
- 코테 파이썬
- vue
- react
- 코딩테스트준비
- 오블완
Archives
- Today
- Total
잡다로그
[Python/코테] 백준 13413 오셀로 재배치 본문
13413 오셀로 재배치
문제 및 조건 설명: https://www.acmicpc.net/problem/13413

알고리즘 설계
💡idea.
가능한 동작은 '바꿔치기' 또는 '뒤집기'이다. 이 때 바꿔치기는 한 번에 두 말을 바꿀 수 있으므로, 최소 횟수를 구하기 위해서는 최대한 바꿔치기를 해주고, 남는 것들을 뒤집어 주어야 한다.
초기 말 상태를 순회하면서 이 바꿔치기를 바로바로 해결할 수 있는데, 나는 별도의 stack 변수를 이용했다.
stack은 기존에 있던 말을 꺼내오고, 바꿔치기가 가능하다면 바로 삭제하는 연산이 쉽다. (pop으로 한 번에!)
🎲step.
1. 초기 상태 말을 순회하며, 바꿔야 하는 말이 있으면 검사를 시작한다.
2. 바꿔야 하는 말을 저장하는 stack 변수에 있던 말과 '바꿔치기'가 가능하다면, 곧장 해준다.
'바꿔치기'가 바로 안되면 같은 색의 말이라는 뜻이다.
3. 1~2번을 반복하며 다른 색의 말이 들어올 때마다 '바꿔치기' 해준다.
4. 바꿔야 하는 말을 저장하는 stack 변수에는 서로 바꿔치기가 불가능한, 전부 같은 색상의 말만 모인다. 즉 길이를 횟수에 더해서 '뒤집기' 연산 횟수를 더한다.
알고리즘 구현
from collections import deque
t = int(input())
def solution(N, arr, answer):
count = 0
change = deque() # 바꿔야 하는 말을 담을 스택
for i in range(N):
if arr[i] != answer[i]:
if change:
piece = change.pop()
if piece != arr[i]: # 바꿔치기가 가능하면
count += 1
else:
change.append(piece) # 꺼낸 말 다시 넣어주기
change.append(arr[i]) # 이번 말도 추가해주기
else:
change.append(arr[i])
count += len(change)
return count
for _ in range(t):
n = int(input())
arr = input()
answer = input()
print(solution(n, arr, answer))
나다어
- 배열 순회는, 요소를 하나씩 검사할 수 있는 기회이기도 하다. 바로 해결할 수 있는 문제들은 다시 순회할 필요 없이 바로 동작이 가능한 것.
'Algorithm' 카테고리의 다른 글
| [JS/코테] 자바스크립트 코테 표준입력 (0) | 2024.05.24 |
|---|---|
| [JS/코테] 자바스크립트 기초 문법 정리 (0) | 2024.05.23 |
| [Python/코테] 백준 12933 오리 (0) | 2024.04.02 |
| [Python/코테] 백준 20922 겹치는 건 싫어 (0) | 2024.04.02 |
| [Python/코테] 백준 14888 연산자 끼워넣기 (1) | 2024.04.01 |
Comments