본문 바로가기
알고리즘/코딩 테스트 문제

[프로그래머스] OX퀴즈(C)

by 진진리 2023. 9. 26.
728x90
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// quiz_len은 배열 quiz의 길이입니다.
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char** solution(const char* quiz[], size_t quiz_len) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.
    char** answer = (char**)malloc(sizeof(char*)*quiz_len);
    for(int i=0;i<quiz_len;i++)
        answer[i] = (char*)malloc(sizeof(char)*10);
    
    for(int i=0;i<quiz_len;i++){
        int num_flag, as_flag, s_flag1, s_flag2;
        int num1, num2, num3;
        num_flag = as_flag = s_flag1 = s_flag2 = 0;
        
        for(int j=0;j<strlen(quiz[i]);j++){
            if(quiz[i][j] >= '0' && quiz[i][j] <= '9'){
                int num;
                if(num_flag == 0){
                    num = quiz[i][j] - '0';
                    num_flag = 1;
                }
                else num = num*10 + quiz[i][j] - '0';
                
                if(s_flag2 == 0){
                    num1 = num;
                    if(s_flag1==0) s_flag1 = 1;
                }
                else if(as_flag == 0) num2 = num;
                else num3 = num;
            }
            else{
                num_flag = 0;
                if(quiz[i][j] == ' ');
                else if(quiz[i][j] == '=') as_flag = 1;
                else if(quiz[i][j] == '+') s_flag2 = 1;
                else{
                    if(s_flag1 == 0) s_flag1 = -1;
                    else if(as_flag != 0) as_flag = -1;
                    else if(s_flag2 != -1) s_flag2 = -1;
                    else if(s_flag2 == -1) s_flag2 = 1; 
                }
            }
            
        }
        if(num1*s_flag1 + num2*s_flag2 == as_flag*num3) answer[i][0] = 'O';
        else answer[i][0] = 'X';
        answer[i][1] = '\0';
    }
    
    return answer;
}

s_flag1는 num1의 부호

s_flag2는 num2의 부호

as_flag는 num3의 부호

s_flag1 * num1 + s_flag2 * num2 = as_flag * num3가 일치하는지 확인

 

**어려웠던 점**

1. 맨 앞의 숫자에 붙는 '-'부호를 고려하지 않음

-> 맨 처음에 '-'가 나오면 s_flag1 = -1로 설정하고 숫자가 s_flag1 = 0인 상태로 num1로 넘어오면 값을 1로 설정

2. 가운데의 연산자 다음에 '-'부호가 중복해서 붙을 수 있다는 것을 고려하지 않음 ex. "2 - -3 = 5"

-> 가운데에 '-'가 나왔을 때 s_flag2가 -1이면 1로, -1이 아니면 -1로 설정