[이코테] 그리디_문자열 뒤집기 (python)

juyeon·2022년 6월 27일
0

문제

나의 풀이

1. 성공

data = input()
num = 0

for i in range(len(data) - 2): #끝에서 두번째 i까지만
    if data[i] != data[i + 1]: # 연속된 두 수가 다른 경우
            num += 1

#연속된 두 수를 비교하는것이 중복되므로, 나누기 2 해주기
if num % 2 == 0: #짝수
    result = num // 2
else:
    result = (num + 1) // 2 

print(result)

: 결국 연속된 묶음의 수가 더 적은 쪽을 세면 된다! 그러기 위해서는 자료를 하나씩 확인하면서, 즉 i와 i+1번째 자료를 비교하면서 서로 다를 경우 카운트 해준다. 그런데 여기서 문제가 발생하는데, i-1과 i를 비교하고, i와 i+1을 각각 비교하면서 중복으로 카운트 된다는 것이다. 중복을 해결하기 위해 짝수인 경우 2로 나누고, 홀수인 경우 1을 더한 후 2로 나눈다. 홀수인 경우 1을 더하는 이유는, 홀수인 즉슨 i-1과 i는 비교했지만 i와 i+1은 비교하지 못한 것이나 다름없기 때문이다.

2. 성공

s = list(input())
before = s[0]
count = 0
for i in s[1:]:
    if before != i:
        count += 1
        before = i
print(s)
print(count//2 + count%2)

다른 사람 풀이

숏코딩

v=input().count
print((v('10')+v('01')+1)//2)
  • count 함수가 이렇게 쓰였던가..?

모범답안

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 + 1] == '1':
    		count0 += 1
    	#다음 수에서 0으로 바뀌는 경우
   		else:
    		count1 += 1
        
print(min(count0, count1))

: 전부 0으로 바꾸는 경우와 전부 1로 바꾸는 경우 중에서 더 적은 횟수를 가지는 경우를 계산하는 방식으로, 어쩌면..직관적...?

profile
내 인생의 주연

0개의 댓글