일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코딩
- 정보처리기사
- 백준 2003
- 부트캠프
- UML
- 디자인패턴
- 코딩테스트
- 삼성
- 싸피
- 삼성 부트캠프
- 개발자
- 취뽀
- dfs
- SWEA
- 비전공자
- 파이썬
- 우테코 프리코스
- 코테
- 우테코
- 우테코 7기
- 마이스터고
- 백준
- 프리코스
- 정처기
- 싸피 13기
- 삼성청년SW아카데미
- 13기
- SSAFY
- 삼성 청년 SW 아카데미
- 삼성 청년 sw아카데미
Archives
- Today
- Total
룰루코딩
백준 1018 체스판 다시 칠하기 본문
문제
솔루션
n, m = map(int,input().split())
li = []
for _ in range(n):
li.append(input())
cnt=[]
for i in range(n-7):
for j in range(m-7):
B=0
W=0
for a in range(i,i+8):
for b in range(j,j+8):
if (a+b) % 2 ==0 :
if li[a][b]!='W':
B+=1
if li[a][b] !='B':
W+=1
else:
if li[a][b] !='B':
B+=1
if li[a][b] !='W':
W+=1
cnt.append(B)
cnt.append(W)
print(min(cnt))
깨달은 점
브루트 포스(brute force)
brute: 무식한, force: 힘, 무식한 힘으로 완전탐색 알고리즘
가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져옴
이 문제는 브루트 포스 알고리즘을 사용해야한다.
체스판 크기도 잘라서 해야하고 B/W 확인도 해야해서 복잡하게 생각했다.
처음에는 B,W 형식의 리스트를 두개 만들어서 해야하나 했지만
모든 경우의 수 돌면서 비교해서 해야했다.
for i in range(n-7):
for j in range(m-7):
이 부분은 행과 열의 시작 고정 부분이고,
for a in range(i,i+8):
for b in range(j,j+8):
이 부분으로 8X8 의 모든 행과열을 돈다.
if (a+b) % 2 ==0 :
if li[a][b]!='W':
B+=1
if li[a][b] !='B':
W+=1
else:
if li[a][b] !='B':
B+=1
if li[a][b] !='W':
W+=1
칸이 짝수번째인지, 홀수번째인지( 흰색이 먼저인 경우와 검은색이 먼저있는 경우 ) 를 나누어
매칭이 되지 않는 부분을 세어준다
**if (a+b) % 2 ==0를 하는이유
0,0 | 0,1 | 0,2 | 0,3 |
1,0 | 1,1 | 1,2 | 1,3 |
2,0 | 2,1 | 2,2 | 2,3 |
3,0 | 3,1 | 3,2 | 3,3 |
체스판 색의 인덱스(a,b)
0(짝) | 1(홀) | 2(짝) | 3(홀) |
1(홀) | 2(짝) | 3(홀) | 4(짝) |
2(짝) | 3(홀) | 4(짝) | 5(홀) |
3(홀) | 4(짝) | 5(홀) | 6(짝) |
행과 열의 인덱스의 합을 이용해
홀짝을 구분하면 색깔이 같은 경우라는 것을 알 수 있다.
cnt.append(B)
cnt.append(W)
print(min(cnt))
min()을 사용하여 최소값을 구한다.
'백준' 카테고리의 다른 글
백준 28702 FizzBuzz (0) | 2024.09.17 |
---|---|
백준 18110 solved.ac (1) | 2024.09.15 |
백준 10816 숫자 카드 2 (0) | 2024.08.11 |
백준 10815 숫자 카드 (0) | 2024.08.10 |
백준 1439 뒤집기 (0) | 2024.08.09 |