[알고리즘] 백준 1439 : 뒤집기 - S5

eternal moment·2023년 6월 22일
0

2023.06.22 풀이

import sys
input=sys.stdin.readline

s=input().rstrip()
a=1
b=0
k=s[0]
j=s[0]
for i in s:
    if i!=k:
        if i==j:
            a+=1
            k=i
        else:
            b+=1
            k=i
    
print(min(a,b))

+ 2023.10.14 풀이

import sys
input=sys.stdin.readline

s=input().rstrip()
k=s[0]
res=0

for i in range(1, len(s)):
    if s[i]!=k and s[i-1]==k:
        res+=1
print(res)

접근방향

  • 가장 먼저 replace() 를 떠올렸으나, '000', '00', '0000', ... 등의 구간을 한 번에 '0'하나로 변환할 수 없고 문자 하나하나 마다 '0'으로 적용될 걸 생각해서 replace는 아니라고 생각.
  • '문자열을 하나하나 돌면서 다른 문자가 나오는지 체크해야하는건가' 하는 생각을 했는데 주어지는 문자열의 길이가 최대 100만이므로 최악의 경우 100만번 반복문을 돌아야할 수 있겠다고 생각함
  • 문자열 전체를 반복문 돌며 앞뒤 글자가 달라지는 걸 체크하여 1과 0의 각 구간의 개수를 세서 그 중 작은 값을 구하는 방법(6/22풀이)을 응용해보면,
    '10101'이나 '101010'의 결과값은 같음. 1이 3개, 0이 2개 or 3개.
    즉 처음으로 글자가 달라지는 구간인 '0의 구간'의 개수가 결과값이 되는 구조.(=문자열의 첫 글자와 달라지는 글자의 구간 갯수를 세는게 포인트)
  • 따라서 구간의 개수를 세는 법은 : 첫 글자와 다른 글자가 나오는 부분의 첫 글자의 개수만 세면 됨. ('011', '01111' 의 경우 모두 인덱스 1번째만 카운트)

다른 풀이

1

a = list(input())
b = a
i = 0
for i in range(len(a)-1) :
  if a[i] == a[i+1] :
    b[i] = []
  else :
    pass
zc = b.count('0')
oc = b.count('1')

print(min(zc,oc))

2

import sys
input = sys.stdin.readline

s = input().rstrip()
n = len(s)
res = 0

for i in range(1, n):
    if s[i - 1] != s[i]:
        res += 1

print((res + 1) // 2)


check point

  • 다른 풀이 2 : 달라지는 횟수만 카운트 해주면 어차피 반복되기 때문에 //2 처리로 풀이 가능.

0개의 댓글