📢 '이것이 코딩 테스트다 with 파이썬' 책을 공부하고 복습하기 위해 작성했습니다.
2023.12.06 - [Algorithm] - [이코테] 02. 그리디(Greedy) 알고리즘, 탐욕법, 욕심쟁이 알고리즘
[이코테] 02. 그리디(Greedy) 알고리즘, 탐욕법, 욕심쟁이 알고리즘
📢 '이것이 코딩 테스트다 with 파이썬' 책을 공부하고 복습하기 위해 작성했습니다. 그리디(Greedy) 알고리즘 (탐욕법) 현재 상황에서 지금 당장 좋은 것만 고르는 방법 순간 가장 좋아 보이는 것
imhihi.tistory.com
문제
https://www.acmicpc.net/problem/1439
1439번: 뒤집기
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모
www.acmicpc.net
0과 1로만 이루어진 문자열 S를 가지고 있다. 이 문자열 S에 있는 숫자를 모두 같게 만들려고 한다.
할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 뒤집는 것이다. 여기서 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
문자열 S가 주어졌을 떄, 해야 하는 행동의 최소 횟수를 구하라
입력 조건
- 첫째 줄에 0과 1로만 이루어진 문자열 S가 주어진다. S의 길이는 100만보다 적다
출력 조건
- 첫째 줄에 행동의 최소 횟수를 출력한다.
입력 예시
0001100
출력 예시
1
문제 분석 및 알고리즘 설계
입력된 문자열을 왼쪽부터 확인한다.
연속된 0 또는 1의 묶음을 체크한다.
더 적은 묶음을 뒤집는다.
나의 풀이
S = input()
# 연속된 0 또는 1의 묶음 갯수
cnt = {
'0': 0,
'1': 0
}
# 이전 값
before = S[0]
for i in S[1:]:
# 이전 값과 다르면,
if i != before:
# 이전 값까지 한 묶음처리
cnt[before] += 1
# 새로운 묶음으로 표시
before = i
# 마지막 묶음 체크
cnt[before] += 1
# 둘 중 작은 값
print(min(cnt['0'], cnt['1']))
다른 풀이
모든 숫자를 전부 같게 만들어야 하므로 전부 0으로 바꾸는 경우와 전부 1로 바꾸는 경우 중에서 더 적은 횟수를 가지는 경우를 계산한다.
답안 예시
data = input()
# 전부 0 또는 1로 바꾸는 경우
count0, count1 = 0, 0
if data[0] == '1':
count0 += 1
else:
count1 += 1
# 두 번째 원소부터 모든 원소를 확인하며
for i in range(len(data) - 1):
# 다음 수에서 1으로 바뀌는 경우
if data[i] != data[i+1]:
count0 += 1
# 다음 수에서 0으로 바뀌는 경우
else:
count1 += 1
print(min(count0, count1))
'Algorithm' 카테고리의 다른 글
[이코테] 그리디 기출문제 - 5. 볼링공 고르기 (0) | 2024.01.19 |
---|---|
[이코테] 그리디 기출문제 - 4. 만들 수 없는 금액 (0) | 2024.01.19 |
[이코테] 그리디 기출문제 - 2. 곱하기 혹은 더하기 (0) | 2024.01.18 |
[이코테] 그리디 기출문제 - 1. 모험가 길드 (0) | 2024.01.18 |