본문 바로가기
알고리즘/백준

1018번 문제 : 체스판 다시 칠하기

by son_i 2023. 3. 16.
728x90

∮1018번: 체스판 다시 칠하기 (acmicpc.net)

 

1018번: 체스판 다시 칠하기

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

www.acmicpc.net

일단 N행 M열만큼 배열 array[N][M]에 한 글자씩 저장하기 !

BufferedReadLine으로 한 줄씩 읽어와서 charAt으로 찢어서 저장.

java
닫기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ‌‌ ‌‌StringTokenizer st = new StringTokenizer(br.readLine()); ‌‌int N = Integer.parseInt(st.nextToken()); ‌‌int M = Integer.parseInt(st.nextToken()); ‌‌char array[][] = new char[N][M]; ‌‌for(int i=0;i<N;i++) { ‌‌‌String str = br.readLine(); ‌‌‌for(int j=0;j<M;j++) { ‌‌‌‌‌array[i][j] =str.charAt(j); ‌‌‌} ‌‌}

 

내가 완성한 코드

java
닫기
package algorithm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main{ public static void main(String[] args) throws IOException { ‌‌BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ‌‌ ‌‌StringTokenizer st = new StringTokenizer(br.readLine()); ‌‌ ‌‌int count = 0; ‌‌int min=100; ‌‌int N = Integer.parseInt(st.nextToken()); ‌‌int M = Integer.parseInt(st.nextToken()); ‌‌char array[][] = new char[N][M]; ‌‌for(int i=0;i<N;i++) { ‌‌‌String str = br.readLine(); ‌‌‌for(int j=0;j<M;j++) { ‌‌‌‌‌array[i][j] =str.charAt(j); ‌‌‌} ‌‌} ‌‌for(int q=0;q<=N-8;q++) { ‌‌‌for(int w=0;w<=M-8;w++){ ‌‌‌‌char c = array[q][w]; ‌‌‌‌count=0; ‌‌‌‌//System.out.println(q+" "+w); ‌‌‌‌‌‌for(int j=q;j<q+7;j+=2) { //짝수행들 검사 ‌‌‌‌‌‌‌for(int k=w;k<w+7;k+=2) {//짝수열 검사 ‌‌‌‌‌‌‌‌if(c != array[j][k]) ‌‌‌‌‌‌‌‌‌count ++; ‌‌‌‌‌‌‌} ‌‌‌‌‌‌‌for(int o=w+1;o<=w+7;o+=2) {//홀수열 검사 ‌‌‌‌‌‌‌‌if(c == array[j][o]) ‌‌‌‌‌‌‌‌‌count ++; ‌‌‌‌‌‌‌} ‌‌‌‌‌‌} ‌‌‌‌‌‌for(int j=q+1;j<=q+7;j+=2) { //홀수행들 검사 ‌‌‌‌‌‌‌for(int k=w+1;k<=w+7;k+=2) {//홀수열들 검사 ‌‌‌‌‌‌‌‌if(c != array[j][k]) ‌‌‌‌‌‌‌‌‌count ++; ‌‌‌‌‌‌‌‌‌ ‌‌‌‌‌‌‌} ‌‌‌‌‌‌‌for(int a=w;a<w+7;a+=2) {//짝수열들 검사 ‌‌‌‌‌‌‌‌if(c == array[j][a]) ‌‌‌‌‌‌‌‌‌count++; ‌‌‌‌‌‌‌} ‌‌‌‌‌‌} ‌‌‌‌‌‌//System.out.println(count); ‌‌‌‌‌‌if( min > count) { ‌‌‌‌‌‌‌min = count; ‌‌‌‌‌‌‌//System.out.println("min"+min); ‌‌‌‌‌‌} ‌‌‌‌‌‌‌ ‌‌‌‌‌} ‌‌‌} ‌‌‌System.out.println(min); } }

맨 윗줄 첫칸을 기준으로 두고 다른 색을 칠하면 되는 문제인 줄 알았는데 문제 이해를 잘못했나보다

이거 때문에 글케 생각했는데..

아무튼 그래서 맨 윗 줄 첫 칸을 기준으로 두고 다른 칸들을 짝수행 + 짝수열/홀수열 , 홀수행 + 홀수열/짝수열 케이스로 나눠서 다 구했는데 예제 답안 중에 딱 하나만 안 됐었어 바로 이거

그래서 내 방법이 틀렸다는 걸 앙ㄹ게됐음

 

어떻게 해야하냐면 일단 첫 번째 정사각형이 흰색인 배열, 검은색인 2차원 배열을 만들어서 원본 입력된 배열과 비교해서 더 작은 차이를 가지는 값을 반환하면 된다 !

java
닫기
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; class Main{ public static void main(String[] args) throws IOException { ‌‌BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ‌‌ ‌‌int num = Integer.parseInt(br.readLine()); ‌‌String[] word = new String[num]; ‌‌ ‌‌//scanner.nextLine(); ‌‌for(int i=0;i<num;i++) { ‌‌‌word[i] = br.readLine(); ‌‌} ‌‌Arrays.sort(word, new Comparator<String>() { ‌‌‌@Override ‌‌‌public int compare(String o1, String o2) { ‌‌‌‌if(o1.length() == o2.length()) { ‌‌‌‌‌//단어 길이가 같으면 사전 순 ‌‌‌‌‌return o1.compareTo(o2); ‌‌‌‌} ‌‌‌‌else return o1.length() - o2.length(); ‌‌‌} ‌‌}); ‌‌StringBuilder sb = new StringBuilder(); ‌‌sb.append(word[0]).append('\n'); ‌‌ ‌‌for(int i=1; i< num; i++) { ‌‌‌if(!word[i].equals(word[i-1])) { ‌‌‌‌sb.append(word[i]).append('\n'); ‌‌‌} ‌‌} ‌‌‌System.out.println(sb); ‌‌//scanner.close(); } }

완떠엉..

728x90

'알고리즘 > 백준' 카테고리의 다른 글

1436번 문제 : 영화감독  (0) 2023.03.18
1259번 문제 : 팰린드롬수  (0) 2023.03.17
10250번 문제 : ACM호텔  (0) 2023.03.13
10814번 문제 : 나이순 정렬  (0) 2023.03.12
7568번 문제 : 덩치  (0) 2023.03.11