본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 1 : 성격 유형 검사하기 C언어

by starfish22 2022. 8. 20.
728x90

▶문제 : 코딩테스트 연습 - 성격 유형 검사하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

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

댓글