세상에 나쁜 코드는 없다

[백준] 2615번 오목 본문

Computer Science/Problem Solving

[백준] 2615번 오목

Beomseok Seo 2021. 1. 31. 17:22

조건과 문제 내용
입출력

 

 

 

#include <iostream>
using namespace std;

int board[21][21];
int dx[8] = {-1,0,1,-1,1,-1,0,1};
int dy[8] = {1,1,1,0,0,-1,-1,-1};
int result[2];


//x,y 좌표를 받으면 해당 좌표 위치가 오목을 만드는지 체크함
//left 남은 좌표 수
//direction 오목이 진행되는 방향
//color 1:흰돌 2:검은돌
//check(5 ,~~) 로 검사할시 오목이면  true, 아니면 false 반환
bool check(int left, int direction, int color,int x, int y)
{
	//시작점에서 출발방향 앞에 같은 숫자가 있는 경우 (6목의 경우를 제거)
	if(left == 5 && board[x-dx[direction]][y-dy[direction]] ==color)
		return false;

	//5목의 경우
	if(left == 0 && board[x][y] != color)  return true;
	
	//6목의 경우
    if(left == 0 && board[x][y] == color) return false;
		
	//주어진 색깔이 다르면 (검은돌과 흰돌 or 오목판 안쪽과 바깥쪽)
    if(board[x][y] != color)
        return false;
   
    // 다음 방향 체크 
    if(check(left-1,direction,color,x+dx[direction],y+dy[direction])) 
        return true;
        
    return false;
}


//check 를 사용하여 각 board의 좌표에서 오목의 경우를 확인함
//오목 발견시 해당 색(1,2) 를 출력하고 result에 각 좌표를 저장후 true 반환
//미발견시 0을 출력하고 false 반환
bool checkFiveInRow() {
    for(int i=1; i<20; i++)
    {
        for(int j=1; j<20; j++)
        {
        	//0이라면 건너뜀 == 1,2의 경우만 확인
            if(board[j][i] == 0)
                continue;
    
    		//8방향 확인
            for(int k=0;k<8;k++)
            {
                if(check(5,k,board[j][i],j,i))
                {
                    cout<< board[j][i] <<endl;
                    result[0] = j;
                    result[1] = i;
                    return true;
                }
            }
        }
    }
    cout<<"0";
    return false;
    
}

//board를 입력에 따라 초기화
//21*21 개의 배열을 선언한 뒤 가장자리를 3으로 초기화하여 운용, 오목판의 외부를 표현
void setBoard()
{
	for(int i = 0; i<21; i++)
	{
		board[0][i] = 3;
		board[21][i] = 3;
		board[i][0] = 3;
		board[i][21] = 3;
	}
    for(int i = 1 ; i< 20; i++)
    {
        for(int j = 1 ; j< 20; j++)
        {
            cin >> board[i][j];
        }
    }
}


int main() {
	setBoard();
	if(checkFiveInRow())
        cout << result[0] << ' ' <<result[1];
    return 0;
}

 

느낀것

 

1. 생각보다 예외처리를 해줘야 할 것이 많았다.

-> 문제가 요구하는 것들 잘 파악해서 예외들을 관리해주어야 할 것 같다. 예외는 다른 곳이 아닌 문제를 더 잘 읽음으로써 찾을 수 있었다.

 

2. 문제를 너무 어렵게 풀지 않았나 싶다.

->문제를 해결하기 전 더 쉬운 방법을 찾도록 노력해보아야 겠다.

 

3. 재귀함수를 만들때에 예외조건, 기저조건의 순서 정확히하기

 - 재귀함수의 내부 if문의 순서로 인해 오류가 생겼던 적이 있다. 재귀함수를 설계할 때에는 어떤 조건을 먼저 적용시켜서 함수를 빠져나가게 만들지 고민해봐야 겠다.