(백준 1439) 뒤집기

ps  · 2 mins read

이해

  • 0과 1로만 이루어진 문자열이 주어질 때, 문자열에 있는 모든 숫자를 전부 같게 만들어야 한다.
  • 문자열에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 행동만 할 수 있다.
  • 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
  • 예를 들어 문자열이 “0001100”일 때, 전체를 뒤집으면 “1110011”이 되고 4번째 문자부터 5번째 문자까지 뒤집으면 “1111111”이 된다. 하지만 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 “0000000”이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
  • 문자열이 주어졌을 때, 문자열에 있는 모든 숫자를 전부 같게 만들기 위해 해야하는 행동의 최소 횟수를 출력하라.

계획

  • 연속된 1들을 모두 뒤집거나 연속된 0들을 모두 뒤집는 경우 중에 행동의 횟수가 더 작은 값을 출력한다.
  • 연속된 1이 몇 세트 있는지, 연속된 0이 몇 세트 있는지를 구해준 후 비교한다.

실행

s = input()
count = [0, 0]
l = len(s)
for i in range(l):
    if (i == l - 1 and s[i-1] != s[i]) or i == l - 2 or (i != l - 1 and s[i] != s[i + 1]):
        count[int(s[i])] += 1
    
print(min(count))

개선

  • 길이에 관계없이 문자가 바뀌는지만 보면 되기 때문에 “0001100”은 “010”으로 보고 0과 1중에서 숫자의 개수가 더 적은 개수를 출력해주면 된다.
  • 연속된 1과 0의 세트의 수를 모두 구해준 다음에 절반으로 나눠준다.
s = input()
count = 0
for i in range(len(S)-1):
    if s[i] != s[i+1]:
        count += 1
print((count + 1) // 2)

회고

  • 다른 사람의 풀이를 보니 쉬운 문제라도 효율적으로 문제를 풀 수 있도록 많이 고민해봐야 겠다고 생각했다. 문제를 잘 풀었어도 다른 사람들의 풀이를 찾아보고 내 코드를 개선해보는 시간을 꼭 가져야 겠다.