백준_1439

임정민·2023년 7월 8일
1

알고리즘 문제풀이

목록 보기
73/173
post-thumbnail

백준 문자열 문제입니다.

문제

https://www.acmicpc.net/problem/1439

[나의 풀이]


S = list(str(input()))

last = S[0]
S.append(last)

cnt = 0
for i in range(len(S)-1):
    if S[i] != S[i+1]:
        cnt += 1
        
print(int(cnt/2))

주어지는 문자열에서 연속되는 0 혹은 1을 뒤집어 모두 같은 수로 만드는 문제입니다. 최초 풀이 시에 0에서 1, 1에서 0으로 바뀌는 횟수에 2를 나누어 해결할수 있다고 생각하였습니다.

하지만 S='11110'과 같은 케이스의 경우가 1번만 바꾸면 되지만 횟수/2를 한다면 0으로 체크되어 예외가 발생하였습니다. 이러한 맨끝만 다른 케이스를 해결하기 위해 0번째 인덱스의 요소를 맨 마지막에 추가하여 S='111101'으로 만들고 (1+1)/2 하는 방식으로 해결하였습니다.🐳🐳🐳

[다른 사람의 풀이1]

import sys
input = sys.stdin.readline
string = str(input())


arr_1 = string.split("1")
arr_0 = string.split("0")

res_1 = 0
res_0 = 0

for i in arr_1:
    if "0" in i:
        res_1 += 1

for i in arr_0:
    if "1" in i:
        res_0 += 1

print(min(res_1, res_0))

다른 사람의 풀이로 입력값을 1 혹은 0으로 split하여

위와 같이 만들고 이때 붙어있는(연속적으로 동일한) 요소들의 갯수를 각각 세어 최소값을 구하는 방식의 풀이를 볼 수 있었습니다.🦝🦝🦝

[다른 사람의 풀이2]


import sys

s = list(sys.stdin.readline().rstrip())
s = list(map(int, s))  # 문자열 '0' -> 0으로, '1'을 1로 변환

zero_result = 0  # 0을 뒤집었을 경우
one_result = 0  # 1을 뒤집었을 경우

for i in range(len(s) - 1):
  if s[i] == 1:  # 뒤집어야 하는게 1인 경우
    if s[i + 1] != 1:  # 현재 값은 1이 아니다. -> 연속적인게 끝났다. -> 값을 증가
      one_result += 1
  else:  # 뒤집어야 하는게 0인 경우
    if s[i + 1] != 0:
      zero_result += 1

# 마지막 문자 계산
if s[-1] == 0: 
  zero_result += 1
else:
  one_result += 1

# 0을 뒤집었을 때, 1을 뒤집었을 때 중에서 최소값을 출력
print(min(one_result, zero_result))

또한 0=>1 , 1=>0으로 바뀌는 횟수를 각각 체크하고 이 둘중의 최소값을 구하는 풀이를 볼 수 있었습니다.

감사합니다.🐤🐤🐤

profile
https://github.com/min731

0개의 댓글