장 준
씨포유
장 준
전체 방문자
오늘
어제
  • 분류 전체보기 (91)
    • 프로그래밍언어 (15)
      • c언어 (10)
      • 파이썬 (0)
      • 자바스크립트 (5)
    • PS (58)
      • 알고리즘 이론 (18)
      • 프로그래머스 (5)
      • 백준 (35)
    • CS (16)
      • 자료구조 (5)
      • 운영체제 (3)
      • 네트워크 (5)
      • 데이터베이스 (0)
      • 기초 지식 (3)
    • 브랜드 (1)

블로그 메뉴

  • 태그

인기 글

태그

  • Implementation
  • Network
  • 코딩테스트
  • python3
  • 기초 지식
  • Stack
  • JavaScript
  • 자료구조
  • C
  • nodejs
  • 파이썬
  • 알고리즘
  • PS
  • DP
  • codesandbox
  • JS
  • Priority Queue
  • 백준
  • 프로그래머스
  • Kruskal algorithm
  • bitmask
  • recursion
  • BFS
  • CS
  • Visual Studio
  • pypy3
  • 씨포유
  • 자바스크립트
  • 프로그래밍언어
  • DFS

최근 댓글

최근 글

hELLO · Designed By 정상우.
장 준

씨포유

[백준(BOJ)] #1285- 동전 뒤집기 (파이썬, PyPy3)
PS/백준

[백준(BOJ)] #1285- 동전 뒤집기 (파이썬, PyPy3)

2022. 7. 18. 17:21
728x90

문제

 

https://www.acmicpc.net/problem/1285

 

1285번: 동전 뒤집기

첫째 줄에 20이하의 자연수 N이 주어진다. 둘째 줄부터 N줄에 걸쳐 N개씩 동전들의 초기 상태가 주어진다. 각 줄에는 한 행에 놓인 N개의 동전의 상태가 왼쪽부터 차례대로 주어지는데, 앞면이 위

www.acmicpc.net


문제 풀이

 

 저는 이 문제를 해결하기 위해 먼저 행 또는 열을 기준으로 선택하여 뒤집는 모든 경우의 수를 구했습니다. 이때 행을 뒤집는 연산을 할 때 비트마스킹을 적용하여 행을 뒤집는 경우의 수를 구했습니다.

 

2022.07.15 - [알고리즘/개념] - [파이썬으로 배우는 알고리즘] 비트마스크(BitMask)

 

[파이썬으로 배우는 알고리즘] 비트마스크(BitMask)

1. 비트마스크(BitMask)란? 컴퓨터는 내부적으로 모든 데이터를 이진수로 표현을 합니다. 예전에 c언어로 비트 체계와 비트 연산자를 간단히 다룬 적이 있는데 비트에 대해서 궁금하신 분들은 참고

c4u-rdav.tistory.com

 

그렇다면 어떻게 비트마스킹을 적용시켜서 행을 뒤집을 수 있을까요?

각 행을 뒤집은 경우를 1, 뒤집지 않은 경우를 0, n의 크기를 3이라고 예를 들면 각 행을 뒤집는 경우의 수를 다음과 같이 이진수로 표현할 수 있습니다.

 

  0 1 2 3 4 5 6 7
이진수 000 001 010 011 100 101 110 111
뒤집은 행 x 1행 2행 1, 2행 3행 1, 3행 2, 3행 1, 2, 3행

이렇게 2^n 가지 경우의 수를 갖게 되고, 행을 뒤집고 나서 이번엔 열을 기준으로도 순회를 해주며 뒤집어 줘야 합니다. 각 열에서 뒷 면의 개수가 더 많으면 n에서 뒷 면의 개수를 뺀 값을 뒷 면의 개수로 하여 뒤집은 걸로 적용시킵니다.

 

풀이 과정

1) 아무 행도 뒤집지 않은 경우. 열 순회 시 1열과 3열이 T가 더 많으므로 뒤집어 줌. 뒷면의 총 개수는 2개

 

2) 1행을 뒤집은 경우. 열 순회 시 1열이 T가 더많으므로 뒤집어 줌. 뒷면의 총 개수는 2개

 

3) 2행을 뒤집은 경우. 열 순회시 3열이 T가 더 많으므로 뒤집어 줌. 뒷면의 총 개수는 2개

 

4) 1, 2행을 뒤집은 경우. 열 순회시 1, 2, 3열이 T가 더 많으므로 뒤집어 줌. 뒷면의 총 개수는 3개

 

5) 3행을 뒤집은 경우. 열 순회시 T가 더 많은 경우는 없으므로 뒤집지 않음. 뒷면의 총 개수는 3개

 

6) 1, 3 행을 뒤집은 경우. 열 순회시 1, 2열이 T가 더 많으므로 뒤집어 줌. 뒷면의 총 개수 2개

 

7) 1, 2, 3 행을 뒤집은 경우. 열 순회시 2열이 T가 더 많으므로 뒤집어 줌. 뒷면의 총 개수 2개

 

8) 최솟값으로 뒷면의 총개수는 2 개

 


구현

코드

n = int(input())
coin = [list(input()) for _ in range(n)]
res = n * n + 1

for bit in range(1 << n):
    #리스트복사
    tmp = [coin[i][:] for i in range(n)]
    for i in range(n):
    	#비트마스킹 만족하면 해당 행 뒤집기
        if bit & (1 << i):
            for j in range(n):
                if tmp[i][j] == 'H':
                    tmp[i][j] = 'T'
                else:
                    tmp[i][j] = 'H'

    tsum = 0
    for i in range(n):
        cnt = 0
        for j in range(n):
            if tmp[j][i] == 'T':
                cnt += 1
        #T가 더 많을 경우 뒤집기
        tsum += min(cnt, n-cnt)
    res = min(res, tsum)

 

결과

728x90
반응형
저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준(BOJ)] #1717- 집합의 표현 (파이썬, Python3)  (0) 2022.07.25
[백준(BOJ)] #11000- 강의실 배정 (파이썬, Python3)  (2) 2022.07.23
[백준(BOJ)] #2263- 트리의 순회 (파이썬, Python3)  (0) 2022.07.20
[백준(BOJ)] #19236- 청소년 상어 (파이썬, PyPy3)  (0) 2022.07.13
[백준(BOJ)] #17144- 미세먼지 안녕! (파이썬, PyPy3)  (0) 2022.07.11
    'PS/백준' 카테고리의 다른 글
    • [백준(BOJ)] #11000- 강의실 배정 (파이썬, Python3)
    • [백준(BOJ)] #2263- 트리의 순회 (파이썬, Python3)
    • [백준(BOJ)] #19236- 청소년 상어 (파이썬, PyPy3)
    • [백준(BOJ)] #17144- 미세먼지 안녕! (파이썬, PyPy3)
    장 준
    장 준
    C4U(Computer For You)

    티스토리툴바