[Algorithm/Java] SWEA 1979번 - 어디에 단어가 들어갈 수 있을까
🔍 문제 풀이
문제 도식화
두 가지 방법이 있다.
- 경계 검사 방식: -
n×n
, 안쪽< n
, 끝에서cnt==k
한 번 더 체크 - 패딩 방식:
n+1×n+1
, 안쪽<= n
, 패딩 0이 끊어줘서 끝 체크 불필요
💻 전체 코드
[방법 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;
}
댓글남기기