본문 바로가기
알고리즘/BOJ(백준)

[ 백준 - 3024 / 구현 ] 마라톤 틱택토

by 뎁꼼 2020. 5. 22.

1. 문제


 

 

3024번: 마라톤 틱택토

문제 상근(Albert), 민혁(Barbara), 선영(Casper), 창영(Dinko), 현진(Eustahije)이가 마라톤 틱택토 게임을 하려고 한다. 이 게임은 N×N 보드에서 진행한다. 맨 처음에 보드의 모든 칸은 비어있다. 플레이어는

www.acmicpc.net

문제

상근(Albert), 민혁(Barbara), 선영(Casper), 창영(Dinko), 현진(Eustahije)이가 마라톤 틱택토 게임을 하려고 한다. 이 게임은 N×N 보드에서 진행한다.

맨 처음에 보드의 모든 칸은 비어있다. 플레이어는 턴을 번갈아가면서 자신의 영어 이름의 첫 글자를 빈 칸에 적는다. (두 사람의 영어 이름의 첫 글자가 같은 경우는 없다)

게임은 세 글자가 행, 열, 또는 대각선으로 연속할 때, 그 플레이어가 승리하며, 게임이 끝나게 된다.

보드판의 상태가 주어졌을 때, 게임이 끝났는지 아닌지를 결정하고, 끝났다면 승자가 누구인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 보드판의 크기 N이 주어진다. (1 ≤ N ≤ 30)

다음 N개 줄에는 보드판의 상태가 주어진다. '.'는 빈 칸을 나타낸다.

항상 승리한 사람이 많아야 한 명인 경우만 입력으로 주어진다. 

출력

첫째 줄에 게임이 끝났다면, 승리한 사람의 영어 이름의 첫 글자를 출력한다. 그렇지 않다면, "ongoing"을 출력한다. 게임을 승리한 사람이 없는데, 빈 칸이 없는 경우에도 ongoing을 출력해야 한다.

예제 입력 1 복사

3 XOC XOC X..

예제 출력 1 복사

X

 

 

 

2. 소스코드


- 문제 번역이 좋지않다. 그냥 단순히 입력을 받고 3개 연속되는게 있는 지 체크만 하면된다.

- 어렵지 않은 문제. 

- 4방향으로 3칸이 이어지는 지 체크하는 부분. dx[ ], dy[ ] 값을 1 , 2 , 3 번 곱해가며 구한다. ( 따라서 p는 1부터 시작)

		for (int j = 0; j < n; j++) {
			for (int k = 0; k < 4; k++){ 
				int cnt = 0;
				for (int p = 1; p <= 2; p++) { 
					if (map[i][j] == getNext(i + (p * dx[k]), j + (p * dy[k]))) 
						cnt++;
				}
				 ....생략....
			}

 

 

 

- 소스코드

#pragma warning (disable : 4996)
#include <cstdio>
#define MAX 30+2
char map[MAX][MAX];

int n;
int dx[] = { 0, 1, 1, 1 };
int dy[] = { 1, 1, 0, -1 };

char getNext(int x, int y)
{
	if (x < 0 or y < 0 or x >= n or y >= n) return '!';
	return map[x][y];
}

int main()
{
	scanf("%d", &n); 
	for (int i = 0; i < n; i++)
		scanf("%s", map[i]);  
 
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			for (int k = 0; k < 4; k++){ 
				int cnt = 0;
				for (int p = 1; p <= 2; p++) { 
					if (map[i][j] == getNext(i + (p * dx[k]), j + (p * dy[k]))) 
						cnt++;
				}
				if (cnt == 2 && map[i][j] != '.') {
					printf("%c", map[i][j]); return 0;
				}
			}
		}

	puts("ongoing");
	return 0;
}