티스토리 뷰
반응형
🔥 백준 1439번 "뒤집기" — 파이썬으로 푸는 2가지 방법
뒤집기 연산을 최소 몇 번 해야 문자열이 전부 같은 숫자가 될까?
이 문제는 문자열을 직접 조작해볼 수도 있고, 핵심 패턴만 파악해서 풀 수도 있습니다.
이번 글에서는 Python으로 해결하는 두 가지 풀이 방식을 소개하고, 어떤 방법이 더 효율적인지도 비교합니다.
📘 문제 요약
- 문자열
S
는 0과 1로만 구성되어 있음 - 연속된 숫자들을 한 번에 골라 뒤집을 수 있음
- 전체 문자열을 하나의 숫자(0 또는 1)로 만들기 위해 필요한 최소 뒤집기 횟수를 구하라
💡 핵심 아이디어
"문자열 전체를 같은 숫자로 만들기 위해 뒤집어야 하는 구간 수가 핵심이다."
즉,
- 0이 한 덩어리로 몇 번 나오는지
- 1이 한 덩어리로 몇 번 나오는지
이 두 값을 비교해서 더 적은 쪽만 전부 뒤집으면 된다.
🔄 방법 1: 시뮬레이션 기반 구현
직접 문자열을 리스트로 바꾸고, 실제로 하나씩 뒤집는 방식입니다.
구간을 저장하고, 적은 쪽의 그룹 중 하나를 찾아 직접 수정합니다.
def main():
arr = list(input().strip())
cnt = 0
n = len(arr)
while True:
arr2 = []
cnt_0 = 0
cnt_1 = 0
start = 0
end = 0
for i in range(n):
if i == n - 1 or arr[i] != arr[i + 1]:
end = i
arr2.append((start, end, arr[i]))
start = i + 1
for s, e, k in arr2:
if k == '0':
cnt_0 += 1
else:
cnt_1 += 1
if cnt_0 == 0 or cnt_1 == 0:
break
cnt += 1
if cnt_1 > cnt_0:
for s, e, k in arr2:
if k == '0':
for i in range(s, e + 1):
arr[i] = '1'
break
else:
for s, e, k in arr2:
if k == '1':
for i in range(s, e + 1):
arr[i] = '0'
break
print(cnt)
main()
✅ 특징
- 그룹을 하나하나 분해하고 수정하는 방식
- 문자열이 어떻게 바뀌는지 직접 확인 가능
- 반복문 + 리스트 수정 구조라서 구현 훈련에 좋음
- 단점: 코드가 길고 비효율적
⚡ 방법 2: 그룹 수만 세는 최적화 코드
문자열을 직접 뒤집지 않고,
'이전 문자와 다를 때'마다 그룹이 바뀌었다고 판단해서 단순히 카운팅만 합니다.
n = input()
cnt0 = 0
cnt1 = 0
# 첫 문자에 따라 초기 그룹 등록
if n[0] == '0':
cnt0 += 1
else:
cnt1 += 1
# 문자 바뀔 때마다 그룹 수 증가
for i in range(1, len(n)):
if n[i] != n[i - 1]:
if n[i] == '0':
cnt0 += 1
else:
cnt1 += 1
print(min(cnt0, cnt1))
✅ 특징
- 문자 하나씩 보면서 그룹 수만 세면 됨
- 문자열 직접 수정 필요 없음
- 시간복잡도 O(N), 공간복잡도 O(1)
- 가장 빠르고 짧은 풀이
🔍 두 방식 비교 요약
항목 | 시뮬레이션 방식 | 그룹 수 계산 방식 |
---|---|---|
핵심 아이디어 | 직접 뒤집기 시도 | 구간 수만 계산 |
구현 난이도 | 복잡함 | 간단함 |
코드 길이 | 김 | 짧음 |
학습 포인트 | 문자열 수정 연습 | 패턴 분석과 카운팅 |
성능 | 느림 (리스트 반복 수정) | 빠름 (한 번 순회) |
✅ 마무리 요약
- 이 문제는 문자열을 직접 뒤집지 않아도 충분히 풀 수 있다.
- "0 그룹이 몇 개인가 vs 1 그룹이 몇 개인가" → 더 적은 쪽만 뒤집으면 됨
- 학습용으로는 시뮬레이션 방식도 한 번쯤 직접 구현해볼 만하다.
- 실전에서는 그룹 수 계산 방식이 가장 효율적이다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 10974번: 모든 순열 풀이 C++ (0) | 2025.06.26 |
---|---|
백준 1476번 '날짜 계산' Python (0) | 2025.06.18 |
백준 1439번 '뒤집기' C++ 개선 (0) | 2025.06.18 |
백준 1439번 문제 '뒤집기' C++ (0) | 2025.06.18 |
C++ 날짜 계산 문제, 백준 1476 (1) | 2025.06.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 알고리즘기초
- C++ 알고리즘
- 브루트포스
- 파이썬
- 그리디
- Python
- 코딩 테스트
- 그리디알고리즘
- 객체지향
- 인접 행렬
- 동적 계획법
- c언어
- 문제풀이
- C++
- c++알고리즘
- python 알고리즘
- dfs
- 동적계획법
- DP
- 알고리즘문제풀이
- 백준
- 그래프 탐색
- 코딩테스트
- 알고리즘
- 코딩
- 파이썬코딩
- 알고리즘 문제풀이
- 프로그래밍
- 문자열처리
- 문제 풀이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형