https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq
문제 접근
이중 for문에서 행을 쭉, 열을 쭉 탐색하면서 1이 얼마나 이어지는지 체크한다.
0을 만나거나 1로 행이 끝났을 때 이어진 1의 크기가 목표 길이와 맞는지 비교
맵을 둘러싸는 가상의 공간이 있다 생각하고 크기를 +2 더 주거나, 맵의 크기를 딱 맞춰서도 풀 수 있다.
++ 유연한 사고를 가지자
맵의 크기를 + 2로 했을 때
import java.util.*;
import java.io.*;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine()); // 테스트 케이스
for(int t=0; t<T; t++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 맵 가로, 세로
int K = Integer.parseInt(st.nextToken()); // 단어 길이
int count = 0;
int[][] map = new int[N+2][N+2]; // int 배열 default 값은 0이다.
for(int i=1; i<=N; i++) {
st = new StringTokenizer(br.readLine()); // bufferedReader는 한 줄로 싹 적고 StringTokenizer가 한 문자씩 자르기
// 스캐너 쓰면 2중 for문 내에서 한 문자씩 칠 수 있을듯
for(int j=1; j<=N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
// System.out.print(map[i][j]+ " ");
}
// System.out.println("");
}
// 행
for(int i=0; i<N+2; i++) {
int curLength = 0;
for(int j=0; j<N+1; j++) {
if(map[i][j] == 0) { // 0일 떄
// 다음 값이 1이라면
if(map[i][j+1] != map[i][j]) curLength++;
}
else { // 1일 때
if(map[i][j+1] == map[i][j]) curLength++;
else { // 1인 상태에서 0을 만나게 되면
if(curLength == K) count++; // 이 때 까지 1의 길이를 더한게 목표 길이가 된 경우
curLength = 0;
}
}
}
// 마지막 행이 1로 끝났을 경우 목표 길이 완성됐는지 확인
if(curLength == K) count++;
}
// 열
for(int i=0; i< N+2; i++) {
int curLength = 0;
for(int j=0; j<N+1; j++) {
if(map[j+1][i] == 0) {// 0일 때
if(map[j+1][i] != map[j][i]) curLength++;
}
else { // 1일 때
if(map[j+1][i] == map[j][i]) curLength++;
else {
if(curLength == K) count++;
curLength = 0;
}
}
}
if(curLength == K) count++;
}
System.out.println("#"+(t+1) + " " + count);
}
}
}
맵의 크기를 딱 맞췄을 때
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine()); // 테스트 케이스
for(int t=0; t<T; t++) {
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 맵 가로, 세로
int K = Integer.parseInt(st.nextToken()); // 단어 길이
int count = 0;
int[][] map = new int[N][N];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine()); // bufferedReader는 한 줄로 싹 적고 StringTokenizer가 한 문자씩 자르기
// 스캐너 쓰면 2중 for문 내에서 한 문자씩 칠 수 있을듯
for(int j=0; j<N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// 행
for(int i=0; i<N; i++) {
int curLength = 0;
for(int j=0; j<N; j++) {
if(map[i][j] == 1) { // 1일 때
curLength++;
}
else { // 0일 때
if(curLength == K) count++;
curLength = 0;
}
}
// 마지막 행이 1로 끝났을 경우 목표 길이 완성됐는지 확인
if(curLength == K) count++;
}
// 열
for(int i=0; i< N; i++) {
int curLength = 0;
for(int j=0; j< N; j++) {
if(map[j][i] == 1) { // 1일 때
curLength++;
}
else { // 0일 때
if(curLength == K) count++;
curLength = 0;
}
}
if(curLength == K) count++;
}
System.out.println("#"+(t+1) + " " + count);
}
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA / 쉬운 거스름돈 / JAVA] (0) | 2023.04.28 |
---|---|
[SWEA / 시각 덧셈 / JAVA] (0) | 2023.04.27 |
[SWEA / 초심자의 회문 검사 / JAVA] (0) | 2023.04.25 |
[SWEA / 스도쿠 검증 / JAVA] (0) | 2023.04.07 |
[SWEA / 달팽이 숫자 / JAVA] (0) | 2023.04.06 |
댓글