일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SSAFY
- 인앱결제
- 리얼클래스
- python
- 구글
- 신문 스크랩
- 백준
- KT
- IT 동향
- 프로그래머스
- 우테코
- SSAFYcial
- java 객체지향 프로그래밍
- 카카오
- 싸피
- 네트워크 관리사
- html
- 코딩테스트
- 네트워크 관리사 2급
- 신문스크랩
- 네트워크 관리사 2급 실기
- IT 트렌드
- 싸피셜
- it 뉴스
- 코딩테스트 연습
- it 이슈
- SSAFY 7기
- Java
- 코테
- 백준위
- Today
- Total
개발자일걸요..?
1018번 체스판 다시 칠하기 본문
문제링크 : www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
이 문제를 풀기 위한 과정
1. chess 판의 8*8칸의 경우를 모두 조사해야한다.
예를 들어 9*10칸의 chess판이 주어졌을 경우,
열은 [0,8), [1,9) 행은[0,8) 로 나눠서 모든 경우의 수를 따져봐야한다.
2. 8*8칸 내에서 수정이 필요한 칸의 수를 알아봐야 한다.
<첫번째 접근법>
8*8칸을 둘러볼때 이중 for문을 사용하는데 그 시작점을 다르게 한다.
ex) 1번 시작 : (0,0) -> (0,7) -> (1,0) 2번 시작 : (0.7) -> (0,0) -> (1,7)
3번 시작 : (7,0) -> (7,7) -> (6,7) 4번 시작 : (7,7) -> (7,0) -> (6,7)
=> 조건을 구분하는 자체가 복잡하고 같은 코드가 반복되어 길어지게 됨
<두번째 접근법>
시작 지점의 좌표의 합이 홀수인지 짝수인지 고려.
->시작지점 좌표의 값이 "B"인지 "W"인지 확인
-> if 시작지점 홀, B이었다면, 짝수칸이 W인지 확인
-> 틀린 칸이 수 세기
=> 코드 자체가 복잡하진 않으나 시작지점을 고쳐야 더 적은 수가 나오는 경우는 고려하지 않음
<최종 접근법>
(해당 좌표의 x+y값) 짝수칸이 W일 경우 고쳐야하는 칸의 수 changeCountW
(해당 좌표의 x+y값) 짝수칸이 B일 경우 고쳐야하는 칸의 수 changeCountB
라고 가정하고 각각의 경우 몇 칸을 고쳐야하는지 확인
-> 둘중 더 작은 changeCount를 리턴
def check(chess, columnR, rowR):
changeCountW = 0
changeCountB = 0
for i in range(rowR,8+rowR):
for j in range(columnR,8+columnR):
if(((i+j)%2 == 1) & (chess[i][j]!="B")):
changeCountW+=1
elif(((i+j)%2 == 0) & (chess[i][j]!="W")):
changeCountW+=1
if (((i + j) % 2 == 1) & (chess[i][j] != "W")):
changeCountB += 1
elif (((i + j) % 2 == 0) & (chess[i][j] != "B")):
changeCountB += 1
if (changeCountW>changeCountB):
return changeCountB
return changeCountW
import sys
M,N = map(int, sys.stdin.readline().split())
chess = list()
for i in range(0,M):
chess.append(sys.stdin.readline())
list = list()
for i in range(0,M-7):
for j in range(0,N-7):
list.append(check(chess,j,i))
minimum = 64
for item in list:
if(item<minimum):
minimum = item
print(minimum)
코드 자체를 마무리 할 수 있었던 건 좋으나 처음엔 첫번째로 생각한 접근법에서 헤어나오질 못해 결국 구글링으로 짝수칸, 홀수칸을 구분해 생각해야 한다는 힌트를 얻었다. 문제에서 말하는 과정을 그대로 코드로 옮기려고 하기보다는 결과값을 빠르게 도출할 수 있는 알고리즘에 대한 고려가 필요한 듯 하다.
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
10989번 수 정렬하기 3 (0) | 2021.02.03 |
---|---|
2750번 수 정렬하기 (0) | 2021.02.02 |
7568번 덩치 (0) | 2021.02.01 |
1436번 영화 감독 숌 (0) | 2021.02.01 |
2231번 분해합 (0) | 2021.01.31 |