백준 1343번 바로가기

나의 풀이

board = []

for i in input().split('.'):
  if len(i) % 2 != 0:
    print(-1)
    break
  if (a:=len(i))%4 == 0:
    board.append("AAAA"*(a//4))
  elif (b:=len(i))%4 == 2:
    board.append("AAAA"*(b//4) + "BB")

else:
  print(*board, sep=".")

고수의 풀이

print((s:=input().replace('X'*4,'A'*4).replace('XX','BB'),-1)['X'in s])

출처

CODE REVIEW

  1. X의 갯수에 따라 처리를 달리 해주어야하는 문제였다. 실버 V치고는 쉬운 편에 속한다.
  2. 고수의 풀이의 논리가 신박했는데, 정리해보면 다음과 같다.
    • XXXX가 있다면 AAAA로 바꾼다.
    • 위의 처리 이후에 XX가 남았다면 BB로 바꾼다.
    • 앞의 처리 이후에도 X가 남았다면 -1을 출력, 남아있는 X가 없다면 처리값을 출력한다.
  3. Greedy Algorithm에 대해 살펴보면 the locally optimal choice at each stage, 즉 현재의 최선의 수 만을 생각하는 것이다. 먼 미래의 영향을 고려하지 않고 현재 상태만을 토대로 행동을 결정하는 것이다.