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 |
Tags
- Matrix
- 코테
- implement
- Counting
- array
- string
- Data Structure
- geometry
- Number Theory
- simulation
- Stack
- 자바
- Math
- SQL
- dynamic programming
- hash table
- two pointers
- 구현
- java
- 코딩테스트
- Binary Search
- greedy
- bit manipulation
- Method
- Tree
- Binary Tree
- 파이썬
- sorting
- database
- Class
Archives
- Today
- Total
코린이의 소소한 공부노트
[백준 온라인 저지] 1780. 종이의 개수 본문
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다.
(1) 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.
(2) (1)이 아닌 경우에는 종이를 같은 크기의 종이 9개로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.
이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.
1. 입력
- 첫째 줄에 N(1 ≤ N ≤ 3^7, N은 3^k 꼴)이 주어진다.
- 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다.
2. 출력
- 첫째 줄에 -1로만 채워진 종이의 개수를, 둘째 줄에 0으로만 채워진 종이의 개수를, 셋째 줄에 1로만 채워진 종이의 개수를 출력한다.
3. 예제
4. 코드
import java.io.*;
import java.util.*;
class Main {
static int[][] paper;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.valueOf(br.readLine());
paper = new int[N][N];
for(int i=0 ; i<N ; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0 ; j<N ; j++) // -1 = 0, 0 = 1, 1 = 2로 처리. -처리가 복잡해지기 때문
paper[i][j] = Integer.valueOf(st.nextToken())+1;
}
char[] arr = cut(N, 0, 0).toCharArray();
int[] count = new int[3]; // -1, 0, 1의 개수
for(int i=0 ; i<arr.length ; i++) {
if(arr[i]=='0') count[0]++;
else if(arr[i]=='1') count[1]++;
else if(arr[i]=='2') count[2]++;
}
for(int i=0 ; i<3 ; i++)
bw.write(count[i]+"\n");
bw.flush(); bw.close();
}
static String cut(int n, int r, int c){
if(n==1) return String.valueOf(paper[r][c]);
String[] part = new String[9];
for(int i=0 ; i<9 ; i++) // 종이 9등분하기
part[i] = cut(n/3, r+(n/3)*(i/3), c+(n/3)*(i%3));
boolean allSame = true;
for(int i=1 ; i<9 ; i++)
if(!part[i].equals(part[0])) {
allSame = false; break;
}
if(allSame && part[0].length()==1) // 모두 같을 경우
return part[0];
String result = "("; // 다를 경우
for(int i=0 ; i<9 ; i++)
result = result.concat(part[i]);
result.concat(")");
return result;
}
}
- 344544KB, 1344ms
'코딩테스트 풀이 > JAVA' 카테고리의 다른 글
[프로그래머스/Lv.1] 실패율 (0) | 2023.07.04 |
---|---|
[프로그래머스/Lv.1] 소수 찾기 (0) | 2023.07.04 |
[백준 온라인 저지] 1992. 쿼드트리 (0) | 2023.07.01 |
[백준 온라인 저지] 1074. Z (0) | 2023.07.01 |
[백준 온라인 저지] 4673. 셀프 넘버 (0) | 2023.07.01 |