[문제]
https://www.acmicpc.net/problem/7682
7682번: 틱택토
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고
www.acmicpc.net
[풀이]
구현 문제이다.
틱택토가 정상적으로 끝난 경우는 다음과 같다.
1. 모든 수를 놓았고, x의 개수가 o의 개수보다 1개 더 많은 경우
-> x와 o 모두 빙고를 이루지 못한 경우
-> x는 빙고를 이루고 o는 빙고를 이루지 못한 경우.
2. 모든 수를 놓지 않은 경우
-> x가 1개 더 많이 놓은 경우 (마지막으로 x가 놓았음)
-> x는 빙고를 이루고 o는 빙고를 이루지 못한 경우.
-> x와 o 모두 같은 개수를 놓은 경우 (마지막으로 o가 놓았음)
-> o는 빙고를 이루고 x는 빙고를 이루지 못한 경우.
위에 쓰인 경우를 제외한 모든 경우는 틱택토가 끝나지 않았거나, 정상적으로 끝나지 않은 경우이다.
나는 특히 빨간색으로 색을 칠한 부분에서 삽질을 했다. 끝났다는 것은 무조건 x가 빙고로 끝나야만 끝난 것으로 생각했었는데, 둘 다 실패할 경우도 있어서 계속 삽질을 했다..
빙고를 체크하는 로직은 가로, 세로, 대각선으로 아래과 같다.
fun check(c : Char, t : ArrayList<CharArray>) : Boolean
{
for(i in 0 until 3) {
if (t[i][0] == c && t[i][1] == c && t[i][2] == c) return true
if (t[0][i] == c && t[1][i] == c && t[2][i] == c) return true
}
if(t[0][0] == c && t[1][1] == c && t[2][2] == c) return true
if(t[2][0] == c && t[1][1] == c && t[0][2] == c) return true
return false
}
[코드]
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
lateinit var ttt : ArrayList<ArrayList<CharArray>>
fun main()
{
var br = BufferedReader(InputStreamReader(System.`in`))
var bw = BufferedWriter(OutputStreamWriter(System.out))
ttt = arrayListOf()
var idx = 0
while(true)
{
val tmp = br.readLine().toString()
if(tmp == "end") break
ttt.add(arrayListOf())
for(i in 0 until 3)
{
ttt[idx].add(tmp.substring(i*3,3+i*3).toCharArray())
}
idx++
}
for(t in ttt)
{
if(tictacto(t))bw.write("valid\n")
else bw.write("invalid\n")
}
bw.flush()
bw.close()
}
fun tictacto(c : ArrayList<CharArray>) : Boolean
{
val ct = count(c)
val ofind = check('O',c)
val xfind = check('X',c)
if(ct.first + ct.second == 9 && ct.first - 1 == ct.second)
{
if(!ofind && !xfind) return true
if(ofind) return false
if(xfind) return true
return false;
}
else if(ct.first + ct.second != 9)
{
if(ct.first - 1 == ct.second)
{
if(ofind) return false
if(xfind) return true
return false;
}
else if(ct.first == ct.second)
{
if(xfind) return false
if(ofind) return true
return false;
}
}
return false
}
fun check(c : Char, t : ArrayList<CharArray>) : Boolean
{
for(i in 0 until 3) {
if (t[i][0] == c && t[i][1] == c && t[i][2] == c) return true
if (t[0][i] == c && t[1][i] == c && t[2][i] == c) return true
}
if(t[0][0] == c && t[1][1] == c && t[2][2] == c) return true
if(t[2][0] == c && t[1][1] == c && t[0][2] == c) return true
return false
}
fun count(t : ArrayList<CharArray>) : Pair<Int,Int>
{
var x = 0
var o = 0
for(i in 0 until 3)
{
for(j in 0 until 3)
{
if(t[i][j] == 'X') x++
else if(t[i][j] == 'O') o++
}
}
return Pair(x,o)
}
'백준 > 구현' 카테고리의 다른 글
백준 1063 [kotlin] (0) | 2023.01.04 |
---|---|
백준 1406 [kotlin] (0) | 2022.06.24 |