[swea/c++] 1979. 어디에 단어가 들어갈 수 있을까

somyeong·2022년 4월 20일
0

SWEA

목록 보기
1/2
post-thumbnail

문제 링크 - https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=1

🌱 문제

🌱 풀이

  • 입력받은 2차원 배열을 돌면서 일일이 현재 좌표 시작하였을때, 답이 될 수 있는지 없는지를 체크하여 갯수를 세었다.
  • 전체 좌표를 도는 이중for문안에서 가로형과 세로형을 나누어서 살펴보았다.
  • 가로형의 경우 과정을 살펴보자 (세로형도 같은 맥락이다)
    1. 현재 좌표가 흰색인지 확인한다.
    2. 현재 좌표에서 시작점이 될 수 있는지를 보는것이기 때문에 현재 좌표가 제일 왼쪽 칸이거나 바로 왼쪽 검정색이어야(막혀있어야) 한다. 현재 좌표가 제일 왼쪽 칸이거나 바로 왼쪽칸이 검정색 일 때 다음과정으로 넘어간다.
    3. 현재 좌표부터 시작해서 가로로 k개의 칸이 흰색인지 확인한다.
      • 이때 k개의 칸이 흰색인 조건이 만족 안되면 4번 과정을 거치치 않아야 하므로 bool flag로 상태를 체크해 주었다.
    4. 3번 과정을 만족했으면 현재 좌표에서 k째 다음칸이 이 가로롤 마지막 칸이거나 k번째 다음칸의 그 다음칸이 검정색 이어야 하므로, 이것을 체크하고 만족하면 cnt값을 올린다.
      (2중 for문을 통해 각 좌표를 돌때마다 flag=true로 놓는것 주의)

🌱 느낀점

  • 어려웠는데 2단계가 맞나 싶다 ..ㅠㅠ
  • 너무 노가다로 푼것 같아서 다른 풀이들도 확인하고 넘어가야 겠다.

🌱 코드

/*

5<=N<=15
2<=K<=N
흰색 1, 검은색 0

*/

#include <iostream>
using namespace std;

int TC, n, k;
int arr[15][15];
int cnt;
bool flag;

void func()
{
    //가로형 살펴보기
   for(int i=0; i<n; i++){
       for(int j=0; j<=n-k; j++){
           flag=true;

           if(arr[i][j]==1){
               //제일 왼쪽칸이거나 바로 왼쪽칸이 막혀있어야 함.
               if(j==0 || arr[i][j-1]==0){
                   for(int x=1; x<k; x++){
                       if(arr[i][j+x]==0){
                           flag=false;
                           break;
                       }
                   }

                   //k개가 비어있는지 확인나서는, 그 k개 다음칸이 마지막칸이거나 0이어야함.
                   if(flag==true){
                       if(j+k==n || arr[i][j+k]==0){
                        //    cout<<"가로 "<<"i: "<<i<<", j: "<<j<<"\n";
                           cnt++;
                       }
                   }
               }
           }
       }
   }


   //세로형 살펴보기
   for(int i=0; i<=n-k; i++){
       for(int j=0; j<n; j++){
           flag=true;

           if(arr[i][j]==1){
               //제일 위쪽칸이거나 바로 위쪽칸이 막혀있어야함
               if(i==0 || arr[i-1][j]==0){
                   for(int x=1; x<k; x++){
                       if(arr[i+x][j]==0){
                           flag=false;
                           break;
                       }
                   }

                   //k개가 비어있는지 확인나서는, 그 k개 다음칸이 마지막칸이거나 0이어야함.
                   if(flag==true){
                       if(i+k==n || arr[i+k][j]==0){
                        //    cout<<"세로 "<<"i: "<<i<<", j: "<<j<<"\n";
                           cnt++;
                       }
                   }
               }
           }
       }
   }
}

    int main()
    {
        cin >> TC;
        for (int i = 1; i <= TC; i++)
        {
            cin >> n >> k;
            cnt = 0;

            for (int j = 0; j < n; j++)
            {
                for (int k = 0; k < n; k++)
                {
                    cin >> arr[j][k];
                }
            }
            func();
            cout << "#" << i << " " << cnt << "\n";
        }
    }
profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글