문제 링크
https://www.acmicpc.net/problem/1439
문제
Q.
0과 1로만 이루어진 문자열이 주어졌을 때, 이 문자열에 있는 모든 숫자를 전부 같게 만들려고 한다. 할 수 있는 행동은 문자열에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S=0001100 일 때,
전체를 뒤집으면 1110011이 된다.
4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.
하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
주어진 문자열을 모두 0 혹은 모두 1로 같게 만드는 최소 횟수를 반환하시오.
input = "011110"
def find_count_to_turn_out_to_all_zero_or_all_one(string):
# 이 부분을 채워보세요!
return 1
result = find_count_to_turn_out_to_all_zero_or_all_one(input)
print(result)
정답 풀이
- 0에서 1을 마주쳤을 때 → 전체를 0으로 만들기 위한 작업
- 1에서 0을 마주쳤을 때 → 전체를 1로 만들기 위한 작업
- 모든것을 0으로 ,1로 만드는 횟수 저장 변수 선언
- for 문 범위 : 0번째 인덱스 ~ 문자열의 맨 뒤에서 앞까지
- i → 0 부터 문자열의 길이 -2 까지
- 현재 인덱스가 다음에 있는 인덱스와 다르면 뒤집어야 하는 포인트
- 다음에 있는 인덱스가 1 → 1을 뒤집어야 함 → count_to_all_zero +1
- 다음에 있는 인덱스가 0 → 0을 뒤집어야 함 → count_to_all_one +1
- 위 for 문은 첫번째 숫자를 고려하지 않았으므로
- 첫번째 숫자가 0 이면 count_to_all_one +1
- 첫번째 숫자가 1 이면 count_to_all_zero +1
input = "011110"
def find_count_to_turn_out_to_all_zero_or_all_one(string):
count_to_all_zero = 0
count_to_all_one = 0
if string[0] == "0":
count_to_all_one += 1
elif string[0] == "1":
count_to_all_zero += 1
for i in range(len(string) - 1):
if string[i] != string[i + 1]:
if string[i + 1] == "1":
count_to_all_zero +=1
if string[i + 1] == "0":
count_to_all_one += 1
print(count_to_all_zero,count_to_all_one)
return min(count_to_all_zero,count_to_all_one)
result = find_count_to_turn_out_to_all_zero_or_all_one(input)
print(result)
문제를 풀고 알게 된 개념 및 소감
- min(a,b) : 둘 중 작은 값을 반환해주는 함수
'백준' 카테고리의 다른 글
| [알고리즘] - 회문 검사 / 파이썬 (0) | 2025.09.02 |
|---|---|
| [알고리즘] - 링크드리스트 합 계산 (1) | 2025.08.28 |
| [백준] - 소수 나열하기(1929)/파이썬 (0) | 2025.08.25 |
| [알고리즘] - 반복되지 않는 문자 (0) | 2025.08.24 |
| [알고리즘] - 곱하기 or 더하기 (0) | 2025.08.24 |