골랜디 #1 7682번
Published at: 2025-03-19
Last modified at: 2025-03-19
안녕하세요 한라나입니다.
원래는 며칠 전부터 시작하려고 했지만..
깃허브 블러그 짜는게 생각보다 어렵네요. 아직도 공사중입니다.
검색어는 당분간은 아래와 같이 쓰기로 했어요.
*g3..g5 !@$me lang:ko s#1557..
왜 골드 3부터냐! 1557은 무슨 근본없는 숫자냐! 할 수 있는데 골드3은 제가 ps를 잘 못해서 그렇고, 1557은 의외로 적당히 풀린 문제 구분하는데 상당한 숫자같아서 정했습니다. 빨리 풀면 좋잖아요
그렇게 처음 걸린 문제가..

구현은 좀;
그래도 골드5라, 약간만 헤메고 풀었습니다.
먼저 입력을 받으면, X갯수(a)와 O갯수(b)를 세어 저장합니다.
틱택토는 번갈아가며 하는 게임이니까, b가 a보다 크거나 a가 b+1보다 크면 잘못된 판입니다.
if((b>a)||(a>b+1)) printf("invalid\n");
숫자가 맞는다면, 판 내부의 X의 갯수는 1~5개가 가능합니다. 그러나 게임이 끝났으면 판이 다 찼거나 세 개가 이어지는 줄이 있다는 이야기이고, 따라서 a가 2보다 작으면 잘못된 판입니다.
else if(a<=2) printf("invalid\n");
이제 맞는 판일 가능성이 생겼으므로, 줄이 있는지 여부를 판단해야 합니다. 저는 모양을 입력받으면 가로, 세로, 대각선에서 총 줄 갯수를 세는 함수를 만들었습니다. 그리고 X줄 갯수를 la, O줄 갯수를 lb로 저장했어요. 그런데 짜고 나서 생각해보니 줄이 두개가 되려면 어차피 5개일때밖에 경우의 수가 없네요?
int lines(char ch) {
int i, j;
int sum = 0;
int stack;
for(i=0;i<3;i++) {
stack = 0;
for(j=0;j<3;j++) {
if(input[i*3+j]==ch) stack++;
}
if(stack==3) sum++;
}
for(i=0;i<3;i++) {
stack = 0;
for(j=0;j<3;j++) {
if(input[i+j*3]==ch) stack++;
}
if(stack==3) sum++;
}
stack = 0;
for(i=0;i<3;i++) {
if(input[i*4]==ch) stack++;
}
if(stack==3) sum++;
stack = 0;
for(i=0;i<3;i++) {
if(input[i*2+2]==ch) stack++;
}
if(stack==3) sum++;
return sum;
}
a가 3이라면 b는 2, 3이 가능합니다. b가 3개라면 O가 놓고 게임이 끝났다는 이야기이니 lb==1, la==0이 아니면 잘못된 판입니다. b가 2개라면 반대입니다.
else if(a==3) {
if(b==3) {
if(la!=0) printf("invalid\n");
else if(lb==0) printf("invalid\n");
else printf("valid\n");
}
else if(la==0) printf("invalid\n");
else printf("valid\n");
}
a가 4일때도 마찬가지입니다.
else if(a==4) {
if(b==4) {
if(la!=0) printf("invalid\n");
else if(lb==0) printf("invalid\n");
else printf("valid\n");
}
else {
if(lb!=0) printf("invalid\n");
else if(la==0) printf("invalid\n");
else printf("valid\n");
}
}
a가 5개라면 반드시 X가 마지막으로 놨으므로 lb==0이기만 하면 la와 상관없이 유효하다고 볼 수 있겠네요.
else if(a==5) {
if(lb==0) printf("valid\n");
else printf("invalid\n");
}
a가 5를 넘어가면 잘못된 판입니다.

감사합니다.

전체 코드
#include <stdio.h>
//using namespace std;
char input[10];
int lines(char ch) {
int i, j;
int sum = 0;
int stack;
for(i=0;i<3;i++) {
stack = 0;
for(j=0;j<3;j++) {
if(input[i*3+j]==ch) stack++;
}
if(stack==3) sum++;
}
for(i=0;i<3;i++) {
stack = 0;
for(j=0;j<3;j++) {
if(input[i+j*3]==ch) stack++;
}
if(stack==3) sum++;
}
stack = 0;
for(i=0;i<3;i++) {
if(input[i*4]==ch) stack++;
}
if(stack==3) sum++;
stack = 0;
for(i=0;i<3;i++) {
if(input[i*2+2]==ch) stack++;
}
if(stack==3) sum++;
return sum;
}
int main() {
while(1) {
scanf("%s", input);
if(input[0]=='e') return 0;
int i;
int a = 0;
int b = 0;
for(i=0;i<9;i++) {
if(input[i]=='X') a++;
else if(input[i]=='O') b++;
}
int la = lines('X');
int lb = lines('O');
if(a<=2) printf("invalid\n");
else if((b>a)||(a>b+1)) printf("invalid\n");
else if(a==3) {
if(b==3) {
if(la!=0) printf("invalid\n");
else if(lb==0) printf("invalid\n");
else printf("valid\n");
}
else if(la==0) printf("invalid\n");
else printf("valid\n");
}
else if(a==4) {
if(b==4) {
if(la!=0) printf("invalid\n");
else if(lb==0) printf("invalid\n");
else printf("valid\n");
}
else {
if(lb!=0) printf("invalid\n");
else if(la==0) printf("invalid\n");
else printf("valid\n");
}
}
else if(a==5) {
if(lb==0) printf("valid\n");
else printf("invalid\n");
}
else printf("invalid\n");
//printf("%d:%d\n", la, lb);
}
return 0;
}