알고리즘 연습/구현, 문자열

[🥈4 / 백준 14394 / 파이썬] 9-퍼즐

김세진 2022. 5. 25. 22:49
반응형

 

 

14394번: 9-퍼즐

첫째 줄에 현재 색칠되어 있는 상태와 둘째 줄에 목표로하는 상태가 주어진다. 각 상태는 길이가 10인 문자열이며, i번째 글자는 i번째 칸의 색을 나타낸다. 'R'은 빨간색, 'G'는 초록색, 'B'는 파란

www.acmicpc.net

 

문제

영선이의 아이디가 nein인 이유는 숫자 9를 좋아하기 때문이다. 그런데 왜 nein일까? 영선이가 아이디를 만들 당시에 영선이는 9가 영어로 nein인줄 알았기 때문이다.

9를 좋아하는 영선이는 9-퍼즐이라는 게임을 만들었다. 이 게임은 변의 길이가 4인 정삼각형 보드 위에서 진행된다. 보드에는 총 10개의 칸으로 이루어져 있으며, 각 칸은 변의 길이가 1인 정삼각형이다. 칸은 0번부터 9번까지 번호가 매겨져 있으며, 아래 그림과 같다.

9개의 칸에는 삼각형 조각이 들어있다. 각 조각은 빨간색, 초록색, 파란색, 노란색 중에 하나이다. 남은 10번째 칸은 비어있다. 이 게임의 목표는 특정한 패턴을 만드는 것이다. 그러기 위해서 영선이는 조각을 인접한 비어있는 칸으로 이동시켜야 한다. 두 칸의 중심의 거리가 1인 경우에 두 칸이 인접해 있다고 한다. 아래 그림은 올바른 이동을 하나 나타낸다.

현재 9-퍼즐에 색칠되어 있는 조각의 상태와 영선이가 목표로 하는 조각의 상태가 입력으로 주어진다. 하지만, 두 상태를 랜덤하게 골랐기 때문에, 게임을 풀 수 없는 경우가 나올 수도 있다. 두 패턴이 주어졌을 때, 게임을 풀 수 있게 하기 위해서 다시 색칠해야 하는 칸의 최소 개수를 구하는 프로그램을 작성하시오. 

입력

첫째 줄에 현재 색칠되어 있는 상태와 둘째 줄에 목표로하는 상태가 주어진다. 각 상태는 길이가 10인 문자열이며, i번째 글자는 i번째 칸의 색을 나타낸다. 'R'은 빨간색, 'G'는 초록색, 'B'는 파란색, 'Y'는 노란색, '*'는 빈 칸을 나타낸다. 빈 칸은 항상 한 개이다.

출력

첫째 줄에 퍼즐을 풀 수 있게 만들기 위해서 다시 색칠해야 하는 칸의 최소 개수를 출력한다.

 

예제 입력 1

BG*YRGRRYR
BGGY*YRRRR

예제 출력 1

0

예제 입력 2

GBBB*BGBBG
RYYY*YRYYR

예제 출력 2

9

예제 입력 3

RRBR*BRBBB
BBRB*RBRRR

예제 출력 3

1

 

 

힌트

예제 1의 경우에는 다음과 같이 게임을 풀 수 있다.

 

풀이

 

퍼즐을 직접 맞추는 알고리즘을 짜는 문제가 아니다.

첫째 줄과 둘째 줄을 비교하여 알파벳이 다른 개수를 세서 출력하면 된다.

 

해쉬 맵을 사용해도 좋고, ord 함수를 이용하여도 된다.

필자는 ord로 해결하여 해당 코드를 첨부한다.

 

import sys
input = sys.stdin.readline

arr = [[0]*26 for _ in range(2)]
for i in range(2):
    for k in input().rstrip().replace('*','').lower():
        arr[i][ord(k)-97] += 1
        
ans = 0
for i in range(26):
    ans += abs(arr[0][i]-arr[1][i])
print(ans//2) # 한쪽만 칠하면 되므로 2로 나눈다
반응형