#1439

zzwwoonn·2022년 5월 11일
1

Algorithm

목록 보기
19/71

처음에 문제를 봤을 때 이렇게 풀어야겠다! 라는 생각이 바로 들지는 않았다. 조금 생각하는 시간이 필요했고 바로 생각해냈다. 서지원! 서지원! 서지원!

문자열을 어떻게 어떤 순서로 바꿔주던지 결론은 항상 전부 0이거나 전부 1이다.

answer0 = 0
# 다 0인 경우
answer1 = 0
# 다 1인 경우
beforeWord0 = "0"
beforeWord1 = "1"

for i in range(len(S)):
    if S[i] != "0":
        if beforeWord0 == "0":
            beforeWord0 = "1"
            answer0 += 1
    else:
        beforeWord0 = "0"

for i in range(len(S)):
    if S[i] != "1":
        if beforeWord1 == "1":
            beforeWord1 = "0"
            answer1 += 1
    else:
        beforeWord1 = "1"

if answer0 < answer1:
    print(answer0)
else:
    print(answer1)

시간 복잡도는 O(2N)이다. 상수를 제거하고 생각할 수 있으므로 O(N)이라고 할 수 있다. 문제 분류가 그리디 알고리즘이라고 나오는데 이게 왜 그리디 알고리즘인지 잘 이해가 되지 않는다. 종종 오셔서 댓글 달아주고 가시는 고수분들 계시는데 ㅎㅎ 댓글로 설명해주시면 너무 감사합니다 🤓

맞췄습니다!!! 를 띄우고 나서 구글링을 했다. 얼마나 더 좋은 풀이가 있을까?


출처 - < ju_h2.log - 백준 1439. 뒤집기 풀이 >

s = input()
change = []
for i in range(1, len(s)):
    if s[i-1] != s[i]:
        change.append(i)
isOdd = False
if len(change)%2 == 1: 
    isOdd = True
    
result = len(change)//2
if isOdd:
    result += 1
print(result)

풀이를 보자마자 든 생각은

  1. 이렇게 풀 수도 있구나...
  2. 진짜 진지하게 다른 사람 풀이를 안보고 이걸 생각해낼 수 있다고?

이렇게 기록도 해놨으니 이런 문제 풀이도 있다는걸 이해하고 받아 들이고 다음에 유사한 문제가 나오면 써먹어야겠다.

내가 푼 방식과 런타임 시간은 정확히 똑같이 나온다.

3개의 댓글

comment-user-thumbnail
2022년 5월 11일

저는 아직 못 푼 문제인데ㅠ 잘 보고 가요

답글 달기
comment-user-thumbnail
2022년 5월 11일

O(2N)을 O(N)이라고 보는 이유
O(2N)이나 O(N)이나 별차이가 없음

예를들어 O(N^2 + 100N)은 몇인가?
이것도 O(N^2)이라고 봄
왜 ? N이 어느 순간부터는 100N보다 N^2에 더 큰 영향을 받기 때문

애초에 빅오 계산법은 정확한 시간복잡도를 계산하는게 아님. 가장 큰걸 찾는게 목표

브루트포스로 풀수있겠지만 그리디로 분류된 이유 = 그리디가 성립하기 때문
한 문제를 해결할 수있는 방법이 꼭 한개라고 생각하는 것은 수능 수학문제를 암기로 푼다는 것과 동치

예를들어 이번 카카오 인턴 4번 문제
4번 문제는 MST + DFS 혹은 다익스트라로 풀이가 가능하지만 둘다 널널한 시간복잡도를 가지기에 두 풀이가 모두 가능했음

그러면 왜 그리디지?가 아니라 어떻게 그리디가 성립하기에 그리디로도 푸는거지? 그리디 풀이는 뭘까?가 맞는 자세

그리디로 문제를 접근하면 1 -> 0과 0 -> 1로 변경하는 부분을 따로 센다음 더 작은 값을 출력하면 됨.
왜? 성립할까?
전부 1이나 0으로 바꾸기 위해서 이 두과정이 필요하고 어차피 이 둘중 하나가 무조건 정답이기 때문
따라서 더 작은 값이 항상 정답을 보장한다는 그리디가 성립
화이팅.

1개의 답글