문제 풀이 날짜: 2023.07.24
포스트 작성일: 2023.07.24

 

* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.

 

문제 출처

Software Expert Academy 11979번: 어디에 단어가 들어갈 수 있을까 (D2) 

 

키워드

구현, 완전 탐색

 

풀이 접근법

  • 주어진 단어가 들어가려면 1로 된 칸이 연속적으로 존재해야 한다.
  • 어떻게 해야 칸이 연속적으로 K개만 존재하도록 만들 수 있을까를 고민해봐야 한다.

 

코드

import java.io.*;
import java.util.StringTokenizer;

public class SWEA1979 {

	public static void main(String args[]) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
		for(int test_case = 1; test_case <= T; test_case++) {
            String[] temp = br.readLine().split(" ");
			
            int N = Integer.parseInt(temp[0]);
            int K = Integer.parseInt(temp[1]);
            
            int[][] matrix = new int[N][N];
           	 
            StringTokenizer st;
            for(int i = 0; i < N; i++) {
                st = new StringTokenizer(br.readLine(), " ");
            	for(int j = 0; j < N; j++) {
                    matrix[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            
            int answer = 0;
            
            int curr = 0;
            int prev = 0;
            int len = 0;
            
            for(int i = 0; i < N; i++) {
            	curr = 0;
            	prev = 0;
            	len = 1;
            	for(int j = 0; j < N; j++) {
            		curr = matrix[i][j];
                    if(curr == 1) {
                    	if(prev == 1) {
                    		len++;
                    	}
                    	else { //prev == 1
                    		prev = 1;
                    	}
                    }
                    else if(curr != 1) {
                    	if(len == K) {
                    		answer++;
                    	}
                    	
                    	prev = 0;
                    	len = 1;
                    }
                }
            	
            	if(len == K) {
            		answer++;
            	}
            }
            
            for(int j = 0; j < N; j++) {
            	curr = 0;
            	prev = 0;
            	len = 1;
            	for(int i = 0; i < N; i++) {
            		curr = matrix[i][j];
                    if(curr == 1) {
                    	if(prev == 1) {
                    		len++;
                    	}
                    	else { //prev == 1
                    		prev = 1;
                    	}
                    }
                    else if(curr != 1) {
                    	if(len == K) {
                    		answer++;
                    	}
                    	
                    	prev = 0;
                    	len = 1;
                    }
                }
            	
            	if(len == K) {
            		answer++;
            	}
            }
            
            sb.append("#").append(test_case).append(" ").append(answer).append("\n");
		}
        
        System.out.print(sb);
	}

}

좀처럼 깔끔한 풀이가 나오지 않는 문제이다. 배열의 가로와 세로를 각각 탐색할 때 필연적으로 중복된 코드가 발생하는데, 이것을 모듈로 분리하고 리팩토링 하는 것이 관건일 듯하다.

 

git 링크

https://github.com/jinju9553/23-CodingTest/blob/main/second/week4/day2/SWEA1979.java

 

+ Recent posts