골랜디 #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은 의외로 적당히 풀린 문제 구분하는데 상당한 숫자같아서 정했습니다. 빨리 풀면 좋잖아요

그렇게 처음 걸린 문제가..

7682

구현은 좀;

그래도 골드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를 넘어가면 잘못된 판입니다.

ac!

감사합니다.

streak


전체 코드

#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;
}

Copyright © 2025- HanLana18. Some rights reserved.

Page last modified: 2025-03-19.