Coding Test/programmers

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

Karla Ko 2023. 8. 12. 15:42
728x90

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

 

프로그래머스

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

programmers.co.kr

 

분석

  1. beginning, target 값이 다르면 1, 같으면 0으로 이차원 diff 배열에 저장
  2. 행마다 뒤집으면서 모든행을 1행과 같게 만들어서, 다른 값(1)이 있는 열만 뒤집으면 목표 상태로 만들 수 있음
    1. diff 1행과 2~n번째 행 비교 : 다르면 뒤집기
    2. 뒤집어도 첫행과 다르다면 목표 상태로 만들 수 없기 때문에 -1 리턴
  3. 모든 행은 같으므로 1행의 다른값(1)의 갯수를 체크 (1행의 1의 갯수 = 열 뒤집는 횟수)
  4. 행 뒤집는 횟수 + 열뒤집는 횟수, 열뒤집는 횟수 + 행뒤집는 횟수 중 최솟값 리턴

 

풀이

def solution(beginning, target):
    n = len(target)
    m = len(target[0])

    diff = [[beginning[i][j] ^ target[i][j] for j in range(m)] for i in range(n)]

    sumr = 0
    for i in range(1,n):
        if (diff[i] != diff[0]):
            sumr+=1 # 행 뒤집는 횟수
            if list(map(lambda x: x ^ 1, diff[i])) != diff[0]:
                return -1

    sumc= sum(diff[0]) # 열 뒤집는 횟수

    return min(sumr+sumc, (n-sumr)+(m-sumc))

 

 

728x90