본문 바로가기
컴퓨터/알고리즘

[SWEA] 11315. 오목 판정

by IT황구 2021. 2. 4.
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AXaSUPYqPYMDFASQ&categoryId=AXaSUPYqPYMDFASQ&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
typedef long long ll;
using namespace std;
char board[20][20];
//8방향 
int mx[8] = {-1,-1,-1,0,0,1,1,1};
int my[8] = {-1,0,1,-1,1,-1,0,1};
void solve(int i,int len)
{
	int posx,posy;
	int flag;
	
		//4가지 방향 우 하 좌하 우하 
	for(int x = 0; x < len; x++)
	{
		for(int y = 0; y < len; y++)
		{
			//좌 
			if(board[x][y] == '.') continue;
			for(int k = 0; k < 8; k++)
			{
				flag = 0;
				posx = x + mx[k];					
				if(!(posx >= 0 && posx < len)) continue;
				posy = y + my[k];
				if(!(posy >= 0 && posy < len)) continue;
				
				if(board[posx][posy] == '.') continue;
				else{
					
					for(int j = 0; j < 3; j++)
					{
						posx = posx + mx[k];					
						if(!(posx >= 0 && posx < len)) break;
						posy = posy + my[k];
						if(!(posy >= 0 && posy < len)) break;
						if(board[posx][posy] == '.') break;		
						flag++;
					}
				}
				if(flag == 3){
					printf("#%d YES\n",i+1);
					return;	
				} 
			}
		}
	}
	printf("#%d NO\n",i+1);
}
int main(void)
{
	int size;
	int len;

	scanf("%d",&size);
	for(int i = 0; i < size; i++)
	{
		scanf("%d",&len);
		for(int x = 0; x < len; x++)
		{
			scanf("%s",board[x]);
		}	
		//가능성이 없는곳은 제외를 해줘야함
		solve(i,len);
		
		
		
	}
	return 0;
}

풀이방법 :

완전탐색

총 8방향으로 움직일 수 있다.

그걸 mx my에 배열로 담아둔다.

1. 내 위치가 . 이면 continuel

2. 내 위치가 o면 그 위치, 방향을 기준으로 O가 5개인지 체크한다.

중간중간에 빨리 continue, break 해서 불필요한 횟수를 줄인다.

왜 flag가 3인가?

예제에 있는 0,4를 기준으로 보면

1. 0,4 에서 o 가 있음.

2. mx,my를 추가해서 1,3에서 o가 있음

이제 for문으로 들어감

3. 1,3에서 -> 2,2로 바뀜. 이후 flag +1

2. 2,2에서 -> 3,1로 바뀜 flag+1

3. 3,1에서 -> 4,0으로 바뀜 flag +1

시행착오:

1. flag 처음에 4로 오해함.

2. 출력형식 NO를 No로 함..

이만..

--END=

 

728x90
반응형