코딩 테스트/Level 3
2차원 동전 뒤집기
컴닥
2022. 11. 23. 00:01
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/131703
비트 마스크(bitmask)를 이용해서
모든 경우의 row를 만들면서, col를 하나씩 맞춰 보면 된다.
비트 마스크를 직접 구현하는 것보다는
itertools.product를 이용하는 것이 좀 더 파이써닉한 것 같아서...
from itertools import product
def flip_column(array, column):
for row in array:
if row[column]:
row[column] = 0
else:
row[column] = 1
def solution(source, target):
answer = float('inf')
row_length, col_length = len(source), len(source[0])
all_flipped = [[0 if element else 1 for element in row] for row in source]
for bit_mask in product((0, 1), repeat=row_length):
new_rows = [all_flipped[i][:] if bit else source[i][:] for i, bit in enumerate(bit_mask)]
counter = sum(bit_mask)
for j in range(col_length):
diff = False
for i in range(row_length):
if new_rows[i][j] != target[i][j]:
diff = True
break
if diff:
flip_column(new_rows, j)
counter += 1
if new_rows == target:
answer = min(answer, counter)
return -1 if answer == float('inf') else answer
테스트 1 〉 통과 (12.02ms, 10.2MB)
테스트 2 〉 통과 (0.44ms, 10.3MB)
테스트 3 〉 통과 (1.29ms, 10.2MB)
테스트 4 〉 통과 (2.23ms, 10.4MB)
테스트 5 〉 통과 (2.66ms, 10.1MB)
테스트 6 〉 통과 (0.28ms, 10.3MB)
테스트 7 〉 통과 (0.60ms, 10.3MB)
테스트 8 〉 통과 (0.44ms, 10.4MB)
테스트 9 〉 통과 (0.21ms, 10.3MB)
테스트 10 〉 통과 (1.87ms, 10.4MB)
테스트 11 〉 통과 (12.47ms, 10.1MB)
테스트 12 〉 통과 (12.03ms, 10.3MB)
테스트 13 〉 통과 (12.89ms, 10.4MB)
테스트 14 〉 통과 (13.06ms, 10.3MB)
테스트 15 〉 통과 (0.01ms, 10.2MB)
테스트 16 〉 통과 (0.02ms, 10.2MB)
테스트 17 〉 통과 (0.02ms, 10.3MB)
테스트 18 〉 통과 (6.85ms, 10.2MB)
테스트 19 〉 통과 (0.04ms, 10.2MB)
테스트 20 〉 통과 (0.04ms, 10.3MB)
테스트 21 〉 통과 (0.02ms, 10.2MB)
반응형