Coding Test/programmers

[Python] 파이썬 프로그래머스 2차원 동전 뒤집기

파송송 2023. 3. 20. 22:11
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/131703

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


나의 풀이

직사각형의 공간에 동전을 행, 열 단위로 뒤집을 수 있음

행, 열 단위로 주어졌을 때 beginning을 target으로 만드는 가장 최소의 경우


 

나의 풀이법은 굉장히 단순하나 깊은 복사, 얕은 복사에 대한 이해도가 있어야 쉽게 풀 수 있는 풀이법  

 

1. 그림과 같이 1~5행을 비교하여 각각의 target의 1~5행에 맞추고 열을 뒤집는다.

2. 그 후 열을 비교해준 뒤 뒤집는다 -> 이때 목표 상태를 만들지 못하는 경우를 제외하고는 전부 다르거나 전부 같거나 2개의 경우 밖에 없음

 


def row_change(coins, row):
    coin = list()
    for idx_c in range(len(coins[row])):
        if coins[row][idx_c] == 1:
            coin.append(0)
        else:
            coin.append(1)
    return coin

def row_re(coins, row):
    coin = list()
    for idx_c in range(len(coins[row])):
        if coins[row][idx_c] == 0:
            coin.append(0)
        else:
            coin.append(1)
    return coin

def col_change(coins, col):
    for idx_c in range(len(coins)):
        if coins[idx_c][col] == 1:
            coins[idx_c][col] = 0
        else:
            coins[idx_c][col] = 1
    return coins


def solution(beginning, target):
    ch = False
    cnt = 0
    answer = 20
    c_len = len(beginning[0])


    for idx in range(c_len):
        cnt = 0
        temp_b = list()
        #행바꾸기
        for r_idx, (b, t) in enumerate(zip(beginning, target)):
            if b[idx] != t[idx]:
                temp_b.append(row_change(beginning, r_idx))
                cnt += 1
            else:
                temp_b.append(row_re(beginning, r_idx))


        #열바꾸기
        for c_idx, (b, t) in enumerate(zip(temp_b[0], target[0])):
            if b != t:
                temp_b = col_change(temp_b, c_idx)
                cnt += 1

        if temp_b == target:
            ch = True
            answer = min(answer, cnt)
    if ch == False:
        return -1
    return answer

처음에 copy()를 통해 복사를 해주는 걸 고려하여 코드를 작성하였는데 깊은 복사가 필요한 상황이었음

copy.deepcopy()를 사용하여 깊은 복사를 진행하였지만 시간이 오래 걸리는 작업이기 때문에 런타임 에러가 발생하여 위와 같이 코드를 수정함

 

 

728x90