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로 설정
'알고리즘 > 코딩 테스트 문제' 카테고리의 다른 글
[프로그래머스] [1차] 비밀지도(Java) (0) | 2023.10.11 |
---|---|
[프로그래머스] 문자열 내림차순으로 배치하기(Java) (0) | 2023.10.10 |
[프로그래머스] 다항식 더하기(C) (0) | 2023.09.25 |
[프로그래머스] 등수매기기(C) (0) | 2023.09.21 |
[프로그래머스] 문자열 계산하기(C) (0) | 2023.09.21 |