코딩 테스트/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)
반응형