일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- M2
- 우리FIS아카데미
- route 53
- 맥
- springboot
- 도메인
- HTTP
- 로드밸런스
- 리눅스
- jdk
- 글로벌소프트웨어캠퍼스
- 우리에프아이에스
- 맥OS
- AWS
- Gradle
- 클라우드 서비스 개발
- 우리FISA #
- sts
- mysql
- dbeaver
- https
- 우리FIS아카데미 #
- 클라우드 서비스 개발 #
- 우리FISA
- 맥북
- Java
- K-디지털트레이닝
- spring
- 우리에프아이에스 #
- Today
- Total
<<개발일지>>
[백준/1018/구현/체스판 다시 칠하기] 본문
https://www.acmicpc.net/problem/1018
1018번: 체스판 다시 칠하기
첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.
www.acmicpc.net
<<풀이>>
하 ㅋㅋ 일단 내 논리적인 생각은 틀린 것이 없었다. 다만 ,, ㅋㅋㅋ 휴ㅠ
문제를 잘 못 읽었다 ㅋㅋㅋ ㅠ
내가 생각한 문제는 주어진 모든 값들에서 추출해 체스판을 만들 수 있냐?? 라고 생각했지만,
다시 읽어 본 결과, 저기서 8 x 8 잘라서 색을 칠하는 최소 횟수를 구하는 것이었다.
아예 접근이 잘못된 것이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
class Main {
static int N, M = 0;
private int solution(String[] brr, int n, int m) {
for (int i = 0; i < n; i++) {
String leng = "";
String[] a = brr[i].split("W");;
for(String x : a) leng=leng+x;
N += leng.length();
}
M = n * m - N;
int b = Math.min(N, M);
if (32 > b) return 32 - b;
else return 0;
}
public static void main(String[] args) throws Exception{
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] arr = br.readLine().split(" ");
int n = Integer.parseInt(arr[0]);
int m = Integer.parseInt(arr[1]);
String[] brr = new String[n];
for (int i = 0; i < n; i++) {
brr[i] = br.readLine();
}
System.out.println(T.solution(brr, n, m));
}
}
정답풀이
위의 그림을 보면 알겠지만 결국 흰색 판부터 시작하는거랑 검은색부터 시작하는 것을 합한다면 판의 칸 수가 일정하게 나오게 된다.
현재 우리는 8x8로 했기 때문에 64개의 판이 나오게 되는데 이를 활용해서 하나만 기준으로 잡고 거기서 64에서 빼고 뺀 값과 기준으로 잡은 것 중에 작은 것을 추출하면 되는 것이다 !!
import java.util.Scanner;
class Main {
static int min = Integer.MAX_VALUE;
static String[] brr = {"WBWBWBWB", "BWBWBWBW"};
private int solution(int startRow, int startCol, String[] arr) {
int whiteBlock = 0;
for (int i = 0; i < 8; i++) {
int row = startRow + i;
for (int j = 0; j < 8; j++) {
int col = startCol + j;
if (arr[row].charAt(col) != brr[row % 2].charAt(j)) whiteBlock++;
}
}
return Math.min(64-whiteBlock, whiteBlock);
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
in.nextLine();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextLine();
}
for (int i = 0; i <= n-8; i++) {
for (int j = 0; j <= m-8; j++) {
int answer = T.solution(i, j, arr);
if (min > answer) min = answer;
}
}
System.out.println(min);
}
}
그리고 여기서 또 신기한 형태가 있다면 바로 수학적인 개념인데 r % 2 의 형태이다 !!
어떻게 보면 당연한 원리이지만 이러한 디테일을 바로적용하는냐는 정말 많은 연습이 필요한 것이다.
이를 활용할 경우 반복되는 형태를 굳이 다 쓸 필요없게 된다.
너무 신기하다 ㅋㅋ
이러한 센스 나도 배우고 가련다 ~~
<<추가 공부>>
nextInt()
nextLine()
next()
문제를 풀다가 보면 상황에 따라 입력 코드가 다르다!!
nextInt() -> 숫자를 입력 받는다.
next() -> 단어 한개를 받는다.
nextLine() -> 한 줄을 입력 받는다.
<오류 발생>
nextInt()를 쓰고
nextLine() 을 사용하게 되면 문제가 발생할 수가 있다.
나는 아무것도 입력 안 했는데 자동으로 nextLine()에 입력이 되는데
nextInt()를 작성하고 엔터를 치면 /n 이라는 개행문자가 그 다음 nextLine()에 적용이 된다 !!
예전에도 이런 경험이 있어서 공부했지만 또 오랫동안 사용 안 하다보니 까먹었다 ㅋㅋ
이를 해결하기 위해서는 nextInt()를 작성해주고 그 다음 한 줄은 nextLine() 하나를 줌으로써 개행문자를 없앤 뒤에
다음 nextLine()을 활용하면 된다.
'코딩테스트' 카테고리의 다른 글
[인프런/BFS/12.토마토] (1) | 2024.05.19 |
---|---|
[인프런/greedy/결혼식] (0) | 2024.04.17 |
[인프런/BFS/11. 미로의 최단거리 통로] (0) | 2024.04.09 |
[백준/1015/수열 정렬] (1) | 2024.04.06 |
[인프런/DFS/10.미로탐색] (5) | 2024.04.01 |