처음에 문제를 봤을 때 이렇게 풀어야겠다! 라는 생각이 바로 들지는 않았다. 조금 생각하는 시간이 필요했고 바로 생각해냈다. 서지원! 서지원! 서지원!
문자열을 어떻게 어떤 순서로 바꿔주던지 결론은 항상 전부 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)
풀이를 보자마자 든 생각은
이렇게 기록도 해놨으니 이런 문제 풀이도 있다는걸 이해하고 받아 들이고 다음에 유사한 문제가 나오면 써먹어야겠다.
내가 푼 방식과 런타임 시간은 정확히 똑같이 나온다.
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으로 바꾸기 위해서 이 두과정이 필요하고 어차피 이 둘중 하나가 무조건 정답이기 때문
따라서 더 작은 값이 항상 정답을 보장한다는 그리디가 성립
화이팅.
저는 아직 못 푼 문제인데ㅠ 잘 보고 가요