[JAVA] SWEA (D2) 1979. 어디에 단어가 들어갈 수 있을까

AIR·2023년 9월 14일
0

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE&problemTitle=&orderBy=PASS_RATE&selectCodeLang=JAVA&select-1=2&pageSize=10&pageIndex=1


문제 설명

(정답률 75.81%)
N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.

주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.


입력 예제

5 3
0 0 1 1 1
1 1 1 1 0
0 0 1 0 0
0 1 1 1 1
1 1 1 0 1
5 3
1 0 0 1 0
1 1 0 1 1
1 0 1 1 1
0 1 1 0 1
0 1 1 1 0


출력 예제

#1 2
#2 6


나의 코드

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

class Solution {
    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 T = Integer.parseInt(br.readLine());
        
        for (int i = 1; i <= T; i++) {

            StringTokenizer st = new StringTokenizer(br.readLine()," ");

            int n = Integer.parseInt(st.nextToken());
            int k = Integer.parseInt(st.nextToken());
            int[][] arr = new int[n][n];
            int rowCount = 0;
            int columnCount = 0;
            int answer = 0;

			//우선 주어진 입력값으로 2차원 배열을 구성한다
            for (int j = 0; j < n; j++) {
                st = new StringTokenizer(br.readLine()," ");
                for (int l = 0; l < n; l++) {
                    arr[j][l] = Integer.parseInt(st.nextToken());
                }
            }

			//2차원 배열의 모든 원소를 확인해야 하므로 2중 for문을 구성
            for (int j = 0; j < n; j++) {
                for (int l = 0; l < n; l++) {
                	//우선 행을 기준으로 카운트한다
                    //각 행이 끝나기 전에 k번을 채우는 경우
                    //원소가 1일때 카운트하며
                    //0이면 카운트값을 0으로 초기화한다
                    //단 이미 카운트 값이 k이면 정답으로 카운트한다                        
                    if (arr[j][l] == 1) {
                        rowCount++;
                    } else if (arr[j][l] == 0) {
                        if (rowCount == k)
                            answer++;
                        rowCount = 0;
                    }
                    //행과 똑같이 열도 카운트를 수행
                    if (arr[l][j] == 1) {
                        columnCount++;
                    } else if (arr[l][j] == 0) {
                        if (columnCount == k)
                            answer++;
                        columnCount = 0;
                    }
                }
				//각 행과 열이 끝났을때 k번을 채우는 경우 정답으로 카운트
                if (rowCount == k)
                    answer++;
                if (columnCount == k)
                    answer++;
                
                // 다음 반복을 위해 카운트값을 0으로 초기화
                rowCount = 0;
                columnCount = 0;
            }
            
            bw.write("#" + i + " " + answer + "\n");
            bw.flush();
        }
        bw.close();
    }
}

정리

처음에는 어떻게 시작을 해야 하나 고민이 좀 있었는데
간단히 생각하니까 쉽게 풀렸다.
댓글을 보니까 전치행렬로 만들어 풀고 했다는데
수학을 그리 잘하지 못하다보니 그냥 직관적으로 푸는게 나한텐 맞는거 같다 ㅎㅎ..

profile
백엔드

0개의 댓글