Programming/알고리즘 & 코테
[그리디] 03.문자열 뒤집기 (유형별 기출문제, 이것이 코딩테스트다 with 파이썬)
kk_______yy
2024. 1. 15. 18:43
그리디 개념
- 현재 상황에서 가장 좋아 보이는 것만을 선택하는 알고리즘
- '최적의 해'를 찾는 문제로 출제 ➝ 그리디 알고리즘의 정당성을 고민해보기
- 다양한 알고리즘에 두루 사용 # ex) 다익스트라 최단 경로 알고리즘, 크루스칼 알고리즘
빈출유형
거스름돈 문제
- 거슬러 줘야 할 동전의 최소 개수 찾는 문제
- 가장 큰 단위의 화폐 ~ 작은 단위의 화폐를 차례대로 확인하고 거슬러 주는 작업
1이 될 때까지
- N이 1이 될 때까지 '1을 빼기' 혹은 'K로 나누기' 연산을 최소 몇 번 수행해야 하는지 계산
- 최대한 많이 나누기가 문제 해결 아이디어
문제
해설
전부 0으로 바꾸는 경우와 전부 1로 바꾸는 경우 중에서 더 적은 횟수를 가지는 겨우 계산
- 모두 0으로 만드는 경우
- 모두 1로 만드는 경우
풀이
data = input()
count0 = 0 # 전부 0으로 바꾸는 경우
count1 = 0 # 전부 1로 바꾸는 경우
# 첫 번째 원소에 대해서 처리
if data[0] == '1':
count0 += 1
else:
count1 += 1
# 두 번째 원소부터 모든 원소를 확인하며
for i in range(len(data) - 1):
if data[i] != data[i + 1]:
# 다음 수에서 1로 바뀌는 경우
if data[i] != data[i+1]:
count0 += 1
# 다음 수에서 0으로 바뀌는 경우
else:
count1 += 1
print(min(count0, count1))
해석
변수 : 숫자 문자열 data, 0횟수 count0, 1횟수 count1
1. 숫자 문자열 data 입력받기
2. 0횟수 count0, 1횟수 count1 초기화
3. 첫 번째 원소 처리 조건문
ㄴ 0 : 0 숫자 개수 세기
ㄴ 1 : 1 숫자 개수 세기
------------------------- 반복문 : 숫자 문자열 data -------------------------
4. 두번째 원소 처리 조건문
ㄴ 1에서 0으로 바뀜 : 0 숫자 개수 세기
ㄴ 0에서 1으로 바뀜 : 1 숫자 개수 세기
--------------------------------------------------------------------------------------
5. count0과 count1 중 작은 수 출력