[코딩 인터뷰][HackerRank] Hexagonal Grid
※ 이 포스트는 HackerRank 문제인 Hexagonal Grid 해설을 담고 있습니다.
본 풀이는 Optimal하지 않을 수 있으며, HackerRank에서의 Submission 통과만을 보장합니다.
Hexagonal Grid
문제 출처 : https://www.hackerrank.com/challenges/hexagonal-grid/problem
카테고리 : BFS or DFS
난이도 : Hard (70 point)
문제 설명
두 줄의 육각형 Grid가 주어진다. 인접한 Grid들은 한 변씩을 공유하고 있는데, 자세한 건 아래 그림을 봐야할 것 같다.
여기서 다음과 같은 1 x 2 크기의 Grid로 주어진 Grid를 모두 채울 수 있는지 여부를 출력해야한다.
맨 위의 두 줄의 Grid에서 두 줄은 항상 같은 길이를 가진다. 위 예제에선 N = 6인 경우다.
N이 주어진 후에, 각각의 줄이 입력으로 주어지는데, 위처럼 회색인 곳은 Grid를 놓을 수 있는 빈 곳으로 0으로 표시된다. 반대로 검은색인 곳은 Grid를 놓을 수 없는데, 이 곳은 1로 표시된다.
문제 풀이
문제를 해결하기 위한 두 가지 포인트가 존재한다.
첫째로, 검은색 Grid가 회색 Grid 영역을 서로 단절시킬 수 있다면, 두 영역은 별도로 계산해도 괜찮다는 점이다. 아래와 같은 입력을 생각해보자.
7
0100000
0100000
N = 3이고 두 줄에 대한 Grid 상태가 다음과 같이 주어졌다. 이런 경우에 검은색 Grid에 의해서 왼쪽의 회색 Grid들과, 오른쪽의 회색 Grid들은 완전히 분리되어있다.
둘째로는 연결된 회색 Grid영역은 모양에 상관없이, 총 Grid의 수가 짝수이기만 하면 1 x 2 Grid로 무조건 채울 수 있다는 점이다. 직관적으로 찾아낼 수도 있고, 증명할 수도 있다. 다른 Grid와 공유하는 변의 수가 가장 적은 Grid부터 차례로 채워나가면, 반드시 전체 영역을 채울 수 있다. 문제에서는 “YES”, “NO”만 출력하므로, 훨씬 간단하게 풀 수 있다.
코드
#!/bin/python3
import os
import sys
#
# Complete the hexagonalGrid function below.
#
def fillGrid(grid, x, y):
vec = [[(0, 1), (0, -1), (1, -1), (1, 0)], [(0, 1), (0, -1), (-1, 0), (-1, 1)]]
q = [(x, y)]
cnt = 0
while len(q) > 0:
(x, y) = q.pop(0)
for v in vec[x]:
new_x, new_y = x + v[0], y + v[1]
if new_x >= 0 and new_y >= 0 and new_x < len(grid) and new_y < len(grid[0]):
if grid[new_x][new_y] == '0':
q.append((new_x, new_y))
grid[new_x][new_y] = '1'
cnt += 1
return cnt
def hexagonalGrid(a, b):
#
# Write your code here.
#
arr = []
arr.append([c for c in a])
arr.append([c for c in b])
for i in range(len(arr)):
for j in range(len(arr[0])):
if arr[i][j] == '0':
arr[i][j] = '1'
if fillGrid(arr, i, j) % 2 == 1:
return "NO"
return "YES"
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
t = int(input())
for t_itr in range(t):
n = int(input())
a = input()
b = input()
result = hexagonalGrid(a, b)
fptr.write(result + '\n')
fptr.close()
코딩 인터뷰 – Hexagonal Grid