본문 바로가기
알고리즘/SWEA

[SWEA / 어디에 단어가 들어갈 수 있을까 / JAVA]

by KDW999 2023. 4. 27.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제 접근

이중 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

댓글