250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Database
- immutable
- binarySearch
- 프록시서버
- proxy
- 이진탐색
- NoSQL
- 데이터베이스
- 얕은복사
- 방어적복사
- 인덱스
- 자료구조
- RDBMS
- 깊은복사
- 조인
- 알고리즘
- ERD
- 정규화
- index
- reverse프록시
- java
- transaction
- acid
- forward프록시
- mutable
- 불변객체
Archives
- Today
- Total
jacketList
1018 체스판 다시 칠하기 본문
728x90
반응형
문제: 지민이가 찾은 M*N의 체스판을 8*8의 형태인 판으로 잘라서 체스판을 만든다고 한다. 체스판이기 때문에 흰칸과 검은칸이 번갈아서 칠해져 있어야 하고 8*8의 크기는 M*N안에서 어느 곳이든 크기가 맞다면 자를 수 있다.
해설
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static boolean[][] arr;
public static int min = 64;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
arr = new boolean[m][n];
for(int i=0; i<m; i++){
//한줄을 미리 다 입력받기
String str = br.readLine();
for(int j=0; j<n; j++){
//한글자씩 검사하는 조건식 W일땐 ture B일땐 false로 저장
if(str.charAt(j) == 'W'){
arr[i][j] = true;
} else {
arr[i][j] = false;
}
}
}
경우의 수를 구하기 위한 변수 설정
int m_row = m-7;
int n_col = n-7;
//전체 경우의 수에 해당하는 체스판을 확인하는 이중for문
for(int i=0; i<m_row; i++){
for(int j=0; j<n_col; j++){
//잘못된 색이 칠해져 있을 때 count를 해주는 메소드 생성
find(i, j);
}
}
System.out.println(min);
}
public static void find(int x, int y){
//8*8이 고정적인 체스판의 크기이므로 매개변수에 +8을 해준 변수 선언
int end_x = x+8;
int end_y = y+8;
int count = 0;
//첫 번째 칸의 색을 tf변수에 저장한다.
boolean tf = arr[x][y];
for(int i=x; i<end_x; i++){
for(int j=y; j<end_y; j++){
//만일 tf와 저장해 놓은 해당 배열의 색이 틀리다면 잘못 칠해진 색 이므로 count를 증가시킨다.
if(arr[i][j] != tf){
count++;
}
//한 칸의 j를 검사했으면 다음 칸의 j를 검사해야 하기 때문에 다음 칸의 j를 검사하기 위해 기존 tf의 색을 다른 색으로 바꿔준다.
tf = !tf;
}
// 한 행의 검사를 끝마쳤으면 다음 행의 첫 번째 칸을 검사하기 위해선 다시 색을 바꿔줘야 한다.
// ※헷갈리지 말것! j=0 다음부터 색을 바꿔주는게 아니라 처음부터 색을 바꿔줌!
// ex)처음 칸이 W라고 한다면, j = 0 : W->B
j = 1 : B->W
j = 2 : W->B
j = 3 : B->W
tf = !tf;
}
//8*8은 총64칸이고 최솟값을 찾아야 한다
//ex) 만일 arr[0][0] 한칸만 잘못칠해져 있다면 63개가 아닌 1이 최솟값
count = Math.min(count, 64-count);
//이전까지 최솟값 보다 count가 더 작을 경우 다시 한번 최솟값을 갱신해준다.
min = Math.min(min, count);
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준:9251 - LCS(Longest Common Subsequence, 최장 공통 부분 수열) (0) | 2024.04.17 |
---|---|
11399 ATM (0) | 2023.11.14 |
진법변환2 11005 (0) | 2023.10.25 |
진법 변환 2745번 (1) | 2023.10.24 |
10809 알파벳 찾기 (0) | 2023.09.28 |