1979. 어디에 단어가 들어갈 수 있을까
1. 문제 N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다. 주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작
tksgk2598.tistory.com
2월에 풀었던 것과는 사뭇 다른 풀이 방식
1. 문제 출처
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
2. 설계
- 정사각형의 크기 N이 주어짐
- 낱말의 길이 K가 주어짐
- 하얀색 빈칸이 딱 K인 부문만 찾아야함 (가로/세로)
- 하얀색 칸 (1)이 나올 땐 count를 up해주다가 검정색 칸(0)이 나올 때 count가 k면 최종 결과 +1을 해준다.
- 혹은 검정색 칸을 만나지 않고, 줄을 넘어갈 때도 count가 k면 최종 결과 +1을 해준다.
- 주의점
public static void colCheck() {
for(int i=0;i<N;i++) {
int count = 0;
for(int j=0;j<N;j++) {
if(arr[j][i]==1) {
//하얀공간
count++;
}else {
//검정공간
if(count==K || j==N-1) {
if(check(count, K)) {
result++;
}
count=0;
}
}
}
}
}
다음줄로 넘어갈 때 체크를 해준다고 했는데, 위 코드처럼 else(검정칸일 때)만 체크해주면, 하얀색 칸에서 다음줄로 넘어갈 때 갯수는 체크해주지 않아 오답이 뜬다.
//가로 찾기
public static void rowCount() {
for(int i=0;i<N;i++) {
int count = 0;
for(int j=0;j<N;j++) {
if(arr[i][j]==1) {
//하얀공간
count++;
}
if((arr[i][j]==0 && count==K) || (j==N-1&& count==K)) {
//검정공간 && count가 K만큼 모임
//다음줄로 넘어가기 전에 체크
if(check(count, K)) {
System.out.println("result = "+result);
result++;
}
count=0;
}
}
}
}
위 코드에서 이렇게 바꿔준다?
여기서 주의할 점은 count==K를 &&로 추가해서 같이 체크해줬다는 것이다.
arr[i][j]==0일 때 count=0으로 만들어줘야 하는데, 그러지 못해서 한 줄에 1이 마구잡이로 3개 있어도 3개의 단어가 들어갈 수 있다고 체크한다. 어차피 check()함수에서 count==K인지 체크해주므로 여기를 제거한다.
3. 전체 코드
import java.util.*;
public class Solution {
static int[][] arr;
static int N;
static int K;
static int result;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int test = sc.nextInt();
for(int T=1;T<=test;T++) {
N = sc.nextInt();
K = sc.nextInt();
arr = new int[N][N];
result = 0;
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
arr[i][j]=sc.nextInt();
}
}
//입력 끝
rowCount();
colCheck();
System.out.println("#"+T+" "+result);
}
}
public static boolean check(int count, int K) {
if(count==K) {
return true;
}
else {
return false;
}
}
//가로 찾기
public static void rowCount() {
for(int i=0;i<N;i++) {
int count = 0;
for(int j=0;j<N;j++) {
if(arr[i][j]==1) {
//하얀공간
count++;
}
if(arr[i][j]==0 || j==N-1) {
//검정공간 && count가 K만큼 모임
//다음줄로 넘어가기 전에 체크
if(check(count, K)) {
result++;
}
count=0;
}
}
}
}
//세로 찾기
public static void colCheck() {
for(int i=0;i<N;i++) {
int count = 0;
for(int j=0;j<N;j++) {
if(arr[j][i]==1) {
//하얀공간
count++;
}
if(arr[j][i]==0 || j==N-1) {
//검정공간 && count가 K만큼 모임
//다음줄로 넘어가기 전에 체크
if(check(count, K)) {
result++;
}
count=0;
}
}
}
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
16546. Baby-gin_실습 [#1차원 배열] (1) | 2023.10.10 |
---|---|
1210. Ladder1 [#2차원 배열] (1) | 2023.10.09 |
1208. Flatten [#1차원 배열] (0) | 2023.10.09 |
16504. Gravity (1차원 배열), 2월의 나와 10월의 나의 풀이 차이 (1) | 2023.10.09 |
1206. View [#1차원 배열] (2) | 2023.10.09 |