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;
}
'알고리즘 > BOJ(백준)' 카테고리의 다른 글
[ 백준-2293번 / DP ] 동전 1 (0) | 2020.05.23 |
---|---|
[ 백준-18809번 / 완전탐색 / 구현 ] Gaaaaaaaaaarden (0) | 2020.05.22 |
[ 백준-18808번 / 구현 ] 스티커 붙이기 (0) | 2020.05.21 |
MIDAS Challenge 2017 예선문제 (0) | 2020.05.18 |
[ 백준 - 14501번 / DP / 완전 탐색 ] 퇴사 (0) | 2020.05.11 |