728x90
▶문제 : 코딩테스트 연습 - 성격 유형 검사하기 | 프로그래머스 스쿨 (programmers.co.kr)
▶코드 작성
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
char *solution(const char *survey[], size_t survey_len, int choices[], size_t choices_len) {
char str[4] = {'R', 'C', 'J', 'A'};//점수를 양수로 저장할 알파벳 고정
char *answer = (char *)malloc(5);
int scores[4] = {0}; // [RT,CF,JM,AN]
for (int i = 0; i < survey_len; i++) {
for (int j = 0; j < 4; j++) {
if (survey[i][0] == str[j]) {//앞 알파벳일 때 '비동의'이므로
scores[j] += 4 - choices[i];//str[j]의 점수가 양수가 되도록 계산
break;
}
if (survey[i][1] == str[j]) {//뒷 알파벳일 때 '동의'이므로
scores[j] += choices[i] - 4;//str[j]의 점수가 양수가 되도록 계산
break;
}
}
}
answer[0] = (scores[0] >= 0) ? 'R' : 'T';//양수라면 str에 있는 알파벳 대입
answer[1] = (scores[1] >= 0) ? 'C' : 'F';//str에 있는 알파벳은 모두 사전순으로 빠름
answer[2] = (scores[2] >= 0) ? 'J' : 'M';
answer[3] = (scores[3] >= 0) ? 'A' : 'N';
answer[4] = '\0';
return answer;
}
▶해석
str배열은 점수를 양수로 저장할 알파벳이다.
survey배열에서 나오는 값들은 항상 "RT" 또는 "TR"처럼 앞뒤가 바뀔 때마다 동의, 비동의가 바뀐다.
따라서 아예 하나를 동의, 다른 하나를 비동의로 고정한다.
여기서 동의는 양수로 비동의는 음수로 점수를 scores배열에 저장한다.
for문으로 survey배열의 길이만큼 반복하고, 4가지의 성격유형이 있으므로 4만큼 다시 반복한다.
survey [i]의 두 알파벳 중 앞글자 또는 뒷글자가 str배열에 있는지 확인한 후 계산한다.
이때 str배열 안의 성격유형의 점수가 양수가 되게끔 간단한 계산식을 세운다.
마지막으로 answer에 각 점수가 높은 성격유형을 대입해야 한다.
scores배열의 점수가 양수라면 str배열에 있는 성격유형을 대입하고 음수라면 그 반대의 성격유형을 대입한다.
scores 점수가 0이라면 사전 순으로 대입해야 하는데 운이 좋게 모두 str배열에 있는 알파벳이 빨라서
if문에서 0과 같을 때도 추가해준다.
728x90
'프로그래머스 > C' 카테고리의 다른 글
프로그래머스 Level 1 : 삼총사 C언어 (0) | 2022.10.24 |
---|---|
프로그래머스 Level 2 : 두 큐 합 같게 만들기 C언어 (0) | 2022.08.23 |
프로그래머스 Level 2 : 올바른 괄호 C언어 (0) | 2022.07.24 |
프로그래머스 Level 2 : 쿼드압축 후 개수 세기 C언어 (0) | 2022.07.24 |
프로그래머스 Level 2 : 교점에 별 만들기 C언어 (0) | 2022.07.23 |
댓글