[ BOJ / Python ] 13413번 오셀로 재배치

황승환·2021년 12월 22일
0

Python

목록 보기
61/498

이번 문제는 말을 뒤집거나 말끼리의 위치를 바꿔서 원하는 순서로 정렬시키는데에 필요한 작업 횟수를 출력하는 문제였다. 말을 원하고자 하는 형태로 바꾸는데에 두가지 작업이 존재해서 처음에는 방향을 잡기 어려웠지만 어느정도 패턴을 파악하였고 그 패턴을 발전시켜서 해결하였다.

초기에 생각한 패턴은 W->B를 세는 bcnt와 B->W를 세는 wcnt를 두고 말들을 확인하며 bcnt와 wcnt를 증가시키고 난 뒤에 bcnt+wcnt-(더 작은 cnt)가 정답을 구할 수 있는 패턴이라고 생각하였다. 실제로도 이 연산은 정답을 출력해주었다. 그러나 이 패턴을 자세히 보니 결국에 정답은 bcnt와 wcnt중 더 큰 값이 된다는 사실을 깨달았다.

WWBB, BBWB 문제를 예시로 확인해보면 다음과 같다.

WWBB -> BWBB (bcnt=1) -> BBBB (bcnt=2) -> BBWB (wcnt=1)
bcnt=2, wcnt=1

모두 뒤집은 경우라면 bcnt+wcnt의 결과인 3이겠지만 더 작은 wcnt가 1이므로 B,W 1개씩은 서로 자리를 바꿀 수 있는 경우가 된다. 두번의 뒤집기가 한번의 바꾸기로 대체되기 때문에 이 문제의 경우 (bcnt+wcnt)-wcnt라고 생각을 하였고 이 식은 결국 bcnt가 되므로 최종 결과는 max(bcnt, wcnt)라고 할 수 있다.

코드는 다음과 같이 작성하였다.

  • 테스트의 수 t를 입력받는다.
  • t번 반복하는 i에 대한 for문을 돌린다.
  • n을 입력받는다.
  • 말의 정렬 상태와 원하는 정렬 상태를 저장하기 위한 배열 o를 선언한다.
  • wcnt와 bcnt를 0으로 정의한다.
  • 2번 반복하는 j에 대한 for문을 돌린다.
    -> 말의 정렬 상태를 입력받는다. 첫번째 반복문에서는 현재의 상태, 두번째 반복문에서는 원하는 상태가 된다.
  • 0부터 n까지 반복하는 j에 대한 for문을 돌린다.
    -> o[0][j]가 W이고 o[1][j]가 B이면 bcnt를 증가시킨다.
    -> o[0][j]가 B이고 o[1][j]가 W이면 wcnt를 증가시킨다.
  • bcnt와 wcnt 중 더 큰 값을 출력한다.

Code

t=int(input())
for i in range(t):
    n=int(input())
    o=[]
    wcnt=0
    bcnt=0
    for j in range(2):
        o.append(str(input()))
    for j in range(n):
        if o[0][j]=='W' and o[1][j]=='B':
            bcnt+=1
        elif o[0][j]=='B' and o[1][j]=='W':
            wcnt+=1
    print(max(bcnt, wcnt))

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글