세상에 나쁜 코드는 없다
[백준] 2615번 오목 본문
#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문의 순서로 인해 오류가 생겼던 적이 있다. 재귀함수를 설계할 때에는 어떤 조건을 먼저 적용시켜서 함수를 빠져나가게 만들지 고민해봐야 겠다.
'Computer Science > Problem Solving' 카테고리의 다른 글
[백준] 2630번: 색종이 만들기 (0) | 2021.03.10 |
---|---|
[백준] 15661번: 링크와 스타트 (0) | 2021.03.01 |
[백준] 7568번: 덩치 (0) | 2021.03.01 |
[백준] 1018번: 체스판 다시 칠하기 (0) | 2021.03.01 |
[백준] 4096번: 팰린드로미터 (0) | 2021.03.01 |