본문 바로가기
공부/백준

[백준] 1518번

by _음주토끼_ 2022. 11. 10.

또 슬금 들어와서 문제 하나 끄적이고 가기

코딩테스트가 코앞인데 졸업 작품도 준비중이라 정신이 없다.🥺

그치만 또 바쁜게 좋은 ESTJ는 그냥 이 상황을 즐기기로...

오늘은 간단하게 1518번 풀이!

 

문제출처: https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 

처음에는 반복문마다 deepcopy를 이용해 8행 8열씩 배열을 만들고,

deepcopy된 배열 내에서 완전탐색으로 상하좌우와 다른 알파벳인지 확인하는 방식으로 해결하려고 했다.

그런데 이렇게 하면 같은 색칠이 된 부분을 기점으로 자꾸 새롭게 칠해서 중복되는(?) 현상이 발생한다.

위의 문제뿐만 아니라 이중 반복문 내에서 계속해서 deepcopy가 이루어지므로 효율성도 떨어진다.

실컷 코드를 작성하고 결과를 출력해보면서 copy까지 할 필요가 없겠구나 했다. 어렵게 돌아갔당..

 

3~6번째 줄은 위에서 작성한 것처럼 처음에 생각했던 방식이다.

체스판의 특징을 잘 생각해보면 그래프 문제가 아니라 수학문제로 풀이가 가능하다.

체스판의 특징은 '대각선이 같은 색'이다. 즉, 행과 열의 인덱스를 합한 값이 짝수/혹은 홀수이면 각각 같은 색이다.

체스판의 맨 첫번째 칸인 0,0 역시 2로 나누었을 때 나머지가 0이므로 짝수라고 두면, 첫 번째 칸을 'W' 또는 'B'로 두는 두 가지 경우가 된다.

 

k,l 반복문 내에서 첫 번째 칸이 'W', 홀수일 때 'B'라고 가정하고 조건에 맞지 않으면 cnt 값을 1씩 증가시킨다.

이때 전체 판의 정보는 계속해서 사용해야하므로 보존을 위해 색칠 값을 덮어씌우지 않는다.

앞서 나는 첫 번째 칸이 'W'일 때를 가정했지만 첫 번째 칸이 'B'일 때 칠해야 하는 값이 더 작다면?

체스판은 8x8 = 64개의 칸을 가지고 있다. 따라서 첫째 칸이 'W'일 때 칠해야 하는 값을 64에서 빼주면 그 값이 나온다.

결국 선택한 8x8 내에서 값은 min(cnt, 64-cnt) 가 된다.

 

i,j 반복문 내에서 8x8을 선택하는 모든 경우의 수가 적용된다.

j 반복문이 끝날 때마다 ans = min(ans, cnt, 64-cnt)를 이용하여 셋 중 가장 작은 값을 적용한다.

(ans의 초기값을 64로 둔 경우는 체스판을 모두 다시 칠해야하는 최악의 경우를 가정)

 

 

지금 마법사 상어와 비바라기 풀고있는데...

이 거칠고 험난한 세상 마법사 상어 앞에서 내가 헤쳐갈수잇을까

아무튼 시간이 된다면 그것도 업로드 해야겠다

안뇽!

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

[백준] 18258번  (0) 2022.10.22
[백준] 2525번  (0) 2022.06.16
[백준] 2581번  (0) 2022.06.16
[백준] 11866번  (0) 2022.06.16
[백준] 2805번  (0) 2022.06.16