새소식

코딩테스트/프로그래머스

[C++] 혼자서 하는 틱택토

  • -

[문제]

https://school.programmers.co.kr/learn/courses/30/lessons/160585

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 풀이]

질문에서 정리를 잘해주신 분(https://school.programmers.co.kr/questions/45745)이 계셔서 덕분에 풀 수가 있었다.

해당 문제에서 정답이 되지 않는 조건은

1) X가 O보다 개수가 많을때

2) O가 X보다 2개이상 많을때

3) O와 X의 빙고수가 일치할때

4) O가 승자일때 X와 O의 숫자가 같을때

5) X가 승자일때 O가 X보다 많을떄

총 5가지 경우가 있고 해당 경우를 모두 조건분기를 사용해서 걸려준 나머지는 1이 된다.

[회고]

조건 판별을 하는 부분이 생각할 거리가 많았었던 문제.

구현은 쉬웠지만 맞추기는 어려웠다.

[코드]

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int graph[10][10];

int solution(vector<string> board) {
    int answer = 1;
    //각각 O과 X의 수를 셀 변수.
    int countCircle = 0;
    int countEx = 0;
    //빙고의 갯수를 셀 변수.
    int checkCircle = 0;
    int checkEx = 0;
    

    
    for(int i = 0;i<board.size();i++){
        for(int j = 0;j<board[i].size();j++){
            if(board[i][j] == 'O'){
                graph[i][j] = 1;
                countCircle++;
            }
            else if(board[i][j] == 'X'){
                graph[i][j] = 2;
                countEx++;
            }
        }
    }
    
    //1 ~ 8 까지 조건 체크.
    //가로
    if(graph[0][0] == graph[0][1] && graph[0][1] == graph[0][2] && graph[0][0] != 0)
    {
        if(graph[0][0] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }
        
    }
    //세로
    if(graph[0][0] == graph[1][0] && graph[0][0] == graph[2][0] && graph[0][0] != 0)
    {
        if(graph[0][0] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }
    //가로
    if(graph[1][0] == graph[1][1] && graph[1][1] == graph[1][2] && graph[1][0] != 0)
    {
        if(graph[1][0] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }
    if(graph[2][0] == graph[2][1] && graph[2][1] == graph[2][2] && graph[2][0] != 0)
    {
        if(graph[2][0] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }
    if(graph[0][1] == graph[1][1] && graph[1][1] == graph[2][1] && graph[0][1] != 0)
    {
        if(graph[0][1] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }
    if(graph[0][2] == graph[1][2] && graph[1][2] == graph[2][2] && graph[0][2] != 0)
    {
        if(graph[0][2] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }
    if(graph[0][0] == graph[1][1] && graph[1][1] == graph[2][2] && graph[0][0] != 0)
    {
        if(graph[0][0] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }    
    if(graph[0][2] == graph[1][1] && graph[1][1] == graph[2][0] && graph[0][2] != 0)
    {
        if(graph[0][2] == 1){
            checkCircle++;
        }
        else{
            checkEx++;
        }        
    }
    
    //1) X가 O보다 개수가 많을때
    if(countEx > countCircle){
        return 0;
    }
    //2) O가 X보다 2개이상 많을때
    if(countCircle > countEx + 1){
        return 0;
    }
    //3) O와 X의 빙고수가 일치할때
    if(checkEx != 0 && checkCircle != 0){
        return 0;
    }
    //4) O가 승자일때 X와 O의 숫자가 같을때
    if(checkCircle != 0){
        if(countCircle == countEx){
            return 0;
        }
    }
    //5) X가 승자일때 O가 X보다 많을떄
    if(checkEx != 0){
        if(countCircle > countEx){
            return 0;
        }
    }    
    
    return answer;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[C++] 뒤에 있는 큰 수 찾기  (0) 2023.04.30
[C++] 입국심사  (0) 2023.04.23
[C++] 두 원 사이의 정수 쌍  (0) 2023.04.14
[C++] 스킬트리  (0) 2023.04.13
[C++] 땅따먹기  (0) 2023.04.13
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.