728x90
https://school.programmers.co.kr/learn/courses/30/lessons/131703
나의 풀이
직사각형의 공간에 동전을 행, 열 단위로 뒤집을 수 있음
행, 열 단위로 주어졌을 때 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
'Coding Test > programmers' 카테고리의 다른 글
[Python] 파이썬 프로그래머스 다리를 지나는 트럭 (0) | 2023.03.31 |
---|---|
[Python] 파이썬 프로그래머스 최고의 집합 (0) | 2023.03.21 |
[Python] 파이썬 프로그래머스 뉴스 클러스터링 (0) | 2023.03.10 |
[Python] 파이썬 프로그래머스 프린터 (0) | 2023.03.09 |
[Python] 파이썬 프로그래머스 선입 선출 스케줄링 (0) | 2023.03.09 |