1 분 소요



1979. 어디에 단어가 들어갈 수 있을까



🔍 문제 풀이

문제 도식화

두 가지 방법이 있다.

  • 경계 검사 방식: - n×n, 안쪽 < n, 끝에서 cnt==k 한 번 더 체크
  • 패딩 방식:
    • n+1×n+1, 안쪽 <= n, 패딩 0이 끊어줘서 끝 체크 불필요

assets/images/2025/SWEA 1979.jpg



💻 전체 코드

[방법 1] 경계 검사 방식

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

public class Solution {
    static int[][] arr;
    static int n, k;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            n = Integer.parseInt(st.nextToken());
            k = Integer.parseInt(st.nextToken());

            arr = new int[n][n];
            for(int i=0; i<n; i++){
                st = new StringTokenizer(br.readLine());
                for(int j=0; j<n; j++){
                    arr[i][j] = Integer.parseInt(st.nextToken());
                }
            }


            int ans = solve();
            System.out.println("#" + tc + " " +ans);
        }

    }
    static int solve(){
        int ans = 0;
        // 가로
        for(int i=0; i<n; i++){
            int cnt = 0;
            for(int j=0; j<n; j++){
                if(arr[i][j] == 1) cnt++; // 1이면 계속 누적
                if(arr[i][j] == 0){  // 0을 만나면 끊김
                    if(cnt == k) ans ++;
                    cnt = 0; // 초기화
                }
            }
            if(cnt == k) ans++; // 줄 끝에서 다시 확인
        }

        // 세로
        for(int i=0; i<n; i++){
            int cnt = 0;
            for(int j=0; j<n; j++){
                if(arr[j][i] == 1) cnt++;
                if(arr[j][i] == 0){
                    if(cnt == k) ans ++;
                    cnt = 0;
                }
            }
            if(cnt == k) ans++;
        }


        return ans;
    }
}


[방법 2] 패딩 방식

static int solve() {
    int ans = 0;

    // 가로
    for (int i = 0; i < n; i++) {
        int cnt = 0;
        for (int j = 0; j <= n; j++) {
            if (arr[i][j] == 1) {
                cnt++;
            } else {
                if (cnt == k) ans++;
                cnt = 0;
            }
        }
    }

    // 세로
    for (int i = 0; i < n; i++) {
        int cnt = 0;
        for (int j = 0; j <= n; j++) {
            if (arr[j][i] == 1) {
                cnt++;
            } else {
                if (cnt == k) ans++;
                cnt = 0;
            }
        }
    }

    return ans;
}


카테고리:

업데이트:

댓글남기기