문제 링크 - 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문안에서 가로형과 세로형을 나누어서 살펴보았다.
- 가로형의 경우 과정을 살펴보자 (세로형도 같은 맥락이다)
- 현재 좌표가 흰색인지 확인한다.
- 현재 좌표에서 시작점이 될 수 있는지를 보는것이기 때문에 현재 좌표가 제일 왼쪽 칸이거나 바로 왼쪽 검정색이어야(막혀있어야) 한다. 현재 좌표가 제일 왼쪽 칸이거나 바로 왼쪽칸이 검정색 일 때 다음과정으로 넘어간다.
- 현재 좌표부터 시작해서 가로로 k개의 칸이 흰색인지 확인한다.
- 이때 k개의 칸이 흰색인 조건이 만족 안되면 4번 과정을 거치치 않아야 하므로 bool flag로 상태를 체크해 주었다.
- 3번 과정을 만족했으면 현재 좌표에서 k째 다음칸이 이 가로롤 마지막 칸이거나 k번째 다음칸의 그 다음칸이 검정색 이어야 하므로, 이것을 체크하고 만족하면 cnt값을 올린다.
(2중 for문을 통해 각 좌표를 돌때마다 flag=true로 놓는것 주의)
🌱 느낀점
- 어려웠는데 2단계가 맞나 싶다 ..ㅠㅠ
- 너무 노가다로 푼것 같아서 다른 풀이들도 확인하고 넘어가야 겠다.
🌱 코드
#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;
}
}
if(flag==true){
if(j+k==n || arr[i][j+k]==0){
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;
}
}
if(flag==true){
if(i+k==n || arr[i+k][j]==0){
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";
}
}