오랜만에 포스팅을 진행한다. 지난 한 달간 제작중인 게임의 데모 버전을 급하게 제출해야해서 포스팅 여유가 부족했다.
다시 시작해보고자 한다.
알고리즘은 아직 프로그래머스 1단계를 중점으로 풀고 있다. 문제를 풀긴 하지만 시간이 오래걸려 반복 숙달을 위해서 인데, 풀다보니 같은 1레벨도 차이가 꽤 나는 듯 싶다.
특히나 카카오의 문제가 다소 어려운 편이다.
R~N까지 총 4가지 지표 8가지 유형이 있다.
지표 별로 응답을 받고, 점수를 통해 어떤 유형에 가까운지 검사하는 것이다. 점수는 1~7까지 주어지며 1에 가까울 수록 왼쪽, 7에 가까울 수록 오른쪽 유형에 점수가 대입된다.
예시
'RT' 지표의 문제에서 7점을 받았다면 T에 3점, 반대로 'TR' 문제에서 7점을 받으면 R에 3점이 된다. 즉, RT냐 TR이냐의 순서도 중요하고, 그 앞 뒤의 순서에 따라 점수를 매기는 방식이다.
시도
우선 8가지의 유형을 모두 Dictionary에 저장해두고
Dictionary<string, int> resultStore = new Dictionary<string, int>(){
{"R",0}, {"T",0}, {"C",0}, {"F",0}, {"J",0}, {"M",0}, {"A",0}, {"N",0}
};
검사를 통해 더 가까운 곳에 점수를 대입하는 방식을 사용했다. survey
를 통해 'RT'냐 'AN'이냐 하는 지표가 들어오는데, 이를 Char[]로 받아서 쪼개고 조건을 걸어 두었다.
for (int i = 0; i < survey.Length; i++)
{
char[] chars = survey[i].ToCharArray();
if (choices[i] == 4) // 두 지표 모두 0점
{
resultStore[chars[0].ToString()] += 0;
resultStore[chars[1].ToString()] += 0;
}
else if (choices[i] > 4) // 4 보다 크면 뒤 유형에 점수를 더해주고
{
resultStore[chars[1].ToString()] += choices[i] - 4;
}
// 1일 경우 3, 2일 경우 2, 3일 경우 1
else if(choices[i] < 4) // 4 보다 작으면 앞 유형에 점수를 더한다.
{
int temp = choices[i] - 4;
temp = (temp >= 0) ? temp : -temp; // 절대 값 구하기
resultStore[chars[0].ToString()] += temp;
}
}
resultStore
라는 Dictionary의 Key값에다가 값을 대입 해주는데 이때 처음에 값에 +=
이 아닌 =
을 사용해서 값이 초기화 되면서 자꾸 틀렸다고 나와서 찾는데 고생했다.
최종적으로 MBTI유형의 값을 계산하기 위해서는 중첩된 값을 비교를 해야하기에 +=
을 사용한다.
이후 resultStore
에 담겨진 값들을 비교하며 어떤 유형의 점수가 더 높은지 비교하는 과정을 거쳤다.
처음에는 위와 같은 방식 처럼 모두 하드코딩을 진행하여 정답을 맞추고자 하였으나, 만약 여기서 MBTI 유형이 변경되거나 추가/감소가 된다면 손 봐야하는 곳이 많아지기에 다른 방식을 사용했다.
Dictionary를 매개변수로 받아서, 그의 Value 값만 List로 따로 빼주었다. 이미 위 과정을 통해 순서대로 담겨 있기에 이를 0번 1번과 같이 두 개의 유형씩 순서대로 비교하며 넣어주면 된다.
for문을 돌면서 저장된 값의 크기를 i와 i+1의 비교하여 같은지, 큰지, 작은지 등을 검사한다. 이후 i+=2를하며 필요 없는 계산을 방지하였다.
만약 값이 같다면 ABCD와 순서대로 더 앞에 있는 알파벳이 나와야하기에 아스키 코드를 이용해 비교 했다. A의 아스키코드는 65, C는 67이기에 아스키코드가 작을 경우 사전 상 우선 순위라 할 수 있다.
같의 차이가 있을 때는 그에 맞는 알파벳을 출력해 넣어주었다.
중간 중간 형 변환이 자주 일어나는 부분이 마음에 들지 않지만 가독성이 괜찮고 깔끔한 코드로 작성된 것 같다.
아직 많이 부족한 풀이 방식입니다. 혹시 지나가시다가 개선사항이 보이면 피드백 부탁드립니다.