λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[SW Expert Academy] - (D2)1979. 어디에 단어가 λ“€μ–΄κ°ˆ 수 μžˆμ„κΉŒ

by 주발2 2020. 6. 23.
λ°˜μ‘ν˜•

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE

 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com

μ½”λ“œ

import java.util.Scanner;

public class Solution {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int t = scan.nextInt();
		for(int tc=1; tc<=t; tc++) {
			int N = scan.nextInt();
			int K = scan.nextInt();
			
			int[][] puzzle = new int[N][N];
			int ans = 0;
			
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					puzzle[i][j] = scan.nextInt();
				}
			}
			
			// κ°€λ‘œλΆ€ν„° λ“€μ–΄κ°ˆ 수 μžˆλŠ”κ³³ μ°ΎκΈ°(흰색: 1, 검은색: 0)
			for(int i=0; i<N; i++) {
				int colCheck = 0;
				for(int j=0; j<N; j++) {
					
					// 검은색이면 0으둜 μ΄ˆκΈ°ν™”, 흰색이면 +1
					if(puzzle[i][j] == 0) {
						
						// κ²€μ€μƒ‰μΌλ•Œ, μ•žμ— 흰칸이 K개인경우 -> 단어가 올 수 있음
						if(colCheck == K) {
							ans ++;
						}
						colCheck = 0;
					} else {
						colCheck += 1;
					}
				}
				
				// 퍼즐의 κ°€λ‘œκ°€ 길이 K와 λ§žμ„κ²½μš° +1
				if(colCheck == K) {
					ans ++;
				}
			}
			
			// μ„Έλ‘œμ— λ“€μ–΄κ°ˆ 수 μžˆλŠ” 자리 μ°ΎκΈ°
			for(int i=0; i<N; i++) {
				int rowCheck = 0;
				for(int j=0; j<N; j++) {
					
					// 검은색이면 0으둜 μ΄ˆκΈ°ν™”, 흰색이면 +1
					if(puzzle[j][i] == 0) {
						
						// κ²€μ€μƒ‰μΌλ•Œ, μ•žμ— 흰칸이 K개인경우 -> 단어가 올 수 있음
						if(rowCheck == K) {
							ans ++;
						}
						rowCheck = 0;
					} else {
						rowCheck += 1;
					}
				}
				
				// 퍼즐의 μ„Έλ‘œκ°€ 길이 K와 λ§žμ„κ²½μš° +1
				if(rowCheck == K) {
					ans ++;
				}
			}
			System.out.println("#" + tc + " " + ans);
		}
		
		scan.close();
	}

}

풀이

2차원 N*N λ°°μ—΄μ—μ„œ 검은색은 0이고, 흰색은 1이닀. 

λ‹¨μ–΄μ˜ 길이가 K인데, ν°μƒ‰μ˜ 갯수(1의 갯수)와 λ‹¨μ–΄μ˜ 길이가 λ™μΌν•˜λ©΄ κ·Έ 단어가 λ“€μ–΄κ°ˆ 수 μžˆλ‹€.

그리고, κ°€λ‘œ μ„Έλ‘œ 검사λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

ν•œκ°€μ§€ 쑰심할점은, μœ„ μ‚¬μ§„μ˜ κ°€μž₯ μ•„λž«μ€„κ³Ό 같이 검은색이 λ‚˜μ™”μ„λ•Œ, ν°μƒ‰μ˜ κ°―μˆ˜κ°€ K와 λ™μΌν•˜λ©΄ μ •λ‹΅μœΌλ‘œ 쳐주어야 ν•œλ‹€. μœ„ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

			// 검은색이면 0으둜 μ΄ˆκΈ°ν™”, 흰색이면 +1
			if(puzzle[i][j] == 0) {
						
				// κ²€μ€μƒ‰μΌλ•Œ, μ•žμ— 흰칸이 K개인경우 -> 단어가 올 수 있음
				if(colCheck == K) {
					ans ++;
				}

μœ„ 쑰건만 κ²€μ‚¬ν•œ ν›„ 검은색이라면 무쑰건 ν°μƒ‰μ˜ κ°―μˆ˜λŠ” 0으둜 μ΄ˆκΈ°ν™” μ‹œμΌœμ£Όκ³ , 흰색이라면 갯수λ₯Ό +1 ν•΄μ£Όλ©΄ λœλ‹€.

 

λ°˜μ‘ν˜•

λŒ“κΈ€