// 각 성격유형을 0으로 초기화
// survey를 반복해서 사용자가 선택한 순서(choices)에 따라 해당하는 유형에 점수를 추가
// 최종 점수를 계산해서 mbti를 리턴
function solution(survey, choices) {
let answer = "";
let mbti = {
R: 0,
T: 0,
C: 0,
F: 0,
J: 0,
M: 0,
A: 0,
N: 0,
};
survey.filter((proposal, i) => {
let score = 0; // 점수를 0으로 초기화
if (choices[i] !== 4) score = Math.abs(choices[i] - 4); // ex) Math.abs(4 - 7) = 2 더해줄 점수를 구한다.
if (choices[i] < 4)
mbti[proposal[0]] += score; // 설문 조사의 결과가 4보다 작으면 앞 mbti에 점수를 줌
else if (choices[i] > 4) mbti[proposal[1]] += score; // 설문 조사의 결과를 4보다 크면 뒤 mbti에 점수를 줌
});
answer += mbti.R >= mbti.T ? "R" : "T"; // 더 큰 값을 리턴하지만 같으면 사전 순으로 빠른 것을 리턴
answer += mbti.C >= mbti.F ? "C" : "F";
answer += mbti.J >= mbti.M ? "J" : "M";
answer += mbti.A >= mbti.N ? "A" : "N";
return answer;
}
// 이번 문제는 푸는 것보다 문제 읽고 이해하는 게 좀 오래 걸렸네요..
function solution(survey, choices) {
let answer = '';
const arr = ['R', 'T', 'C', 'F', 'J', 'M', 'A', 'N'];
const num = [0, 0, 0, 0, 0, 0, 0, 0];
for (let i = 0; i < survey.length; i++) {
const el = survey[i].split('');
if (choices[i] < 4) {
if (choices[i] === 3) num[arr.indexOf(el[0])] += 1;
if (choices[i] === 2) num[arr.indexOf(el[0])] += 2;
if (choices[i] === 1) num[arr.indexOf(el[0])] += 3;
} else if (choices[i] > 4) {
if (choices[i] === 5) num[arr.indexOf(el[1])] += 1;
if (choices[i] === 6) num[arr.indexOf(el[1])] += 2;
if (choices[i] === 7) num[arr.indexOf(el[1])] += 3;
}
}
for (let i = 0; i < 4; i++) {
const name = arr.splice(0, 2);
const score = num.splice(0, 2);
if (score[0] > score[1]) answer += name[0];
if (score[0] < score[1]) answer += name[1];
if (score[0] === score[1]) answer += name.sort()[0];
}
return answer;
}
//늦어져서 죄송합니다.
function solution(survey, choices) {
//16개의 유형
//7개의 선택지, n개의 질문
//survey는 지표, choice 선택한 선택지(1~7, 1 :매우 비동의, 7 : 매우 동의 )
// 앞에오는 것이 동의, 뒤에오는 것이 비동의
const total =survey.map((s, i)=> {return {survey: s, choice:choices[i]} });
// choice 에대해 choice-4를 해주면 0 이이면 모두 0점, -이면 4-choice를 해서 뒤에 점수를 준다.
const index=["RT", "CF", "JM", "AN"];
const score=new Map();
//index를 돌며 각 type 에 대한점수를 0점으로 초기화
for(let i of index){
let [i1,i2]=i;
score.set(i1, 0);
score.set(i2, 0);
}
// 4점을 기준으로 해당 타입에 점수를 주자
total.forEach(v=>{
const {survey, choice}=v;
const a=choice-4;
if(a>0){
score.set(survey[1], score.get(survey[1])+a);
}else if (a<0){
score.set(survey[0], score.get(survey[0])+(a*-1));
}
});
// 인덱스는 사전순으로 묶여있어서 점수가 같다면 앞에것가 오면 된다.
let result="";
for(let i of index){
let[t1,t2]=i;
let [t1Score, t2Score]=[score.get(t1), score.get(t2)];
if(t1Score<t2Score){
result+=t2;
}else{
result+=t1;
}
}
return result ;
}
//
function solution(survey, choices) {
const scores = {}; // 각 성격 유형 8가지에 대한 점수 ex. { N: 1, C: 1, M: 2, T: 3, A: 1 }
// 각 성격유형에 대한 점수를 기록합니다.
survey.forEach((surveyItem, idx) => {
const score = Math.abs(choices[idx] - 4);
if (choices[idx] - 4 < 0) { // 비동의한 경우
if (scores[surveyItem[0]]) scores[surveyItem[0]] += score;
else scores[surveyItem[0]] = score;
} else if (choices[idx] - 4 > 0) { // 동의한 경우
if (scores[surveyItem[1]]) scores[surveyItem[1]] += score;
else scores[surveyItem[1]] = score;
}
})
// 서로 짝을 정의해놓습니다. (알파벳 빠른 애가 키입니다.)
const types = {
"R": "T",
"C": "F",
"J": "M",
"A": "N",
}
let result = [];
Array.from("RCJA").forEach((char) => {
if (scores[char] && !scores[types[char]]) result.push(char);
else if (!scores[char] && scores[types[char]]) result.push(types[char]);
else if (!scores[char] && !scores[types[char]]) result.push(char); // 둘 다 점수가 없으면 알파벳 빠른 애로
else if (scores[types[char]] > scores[char]) result.push(types[char]);
else result.push(char);
})
return result.join('');
}
// 다른 분들 점수를 처음부터 0으로 초기화한 코드 보고 수정해봤어요.. ㅎㅎㅎ
function solution(survey, choices) {
const scores = {R: 0, T: 0, C: 0, F: 0, J: 0, M: 0, A: 0, N: 0}; // 각 성격 유형 8가지에 대한 점수
// 각 성격유형에 대한 점수를 기록합니다.
survey.forEach((surveyItem, idx) => {
const score = Math.abs(choices[idx] - 4);
if (choices[idx] - 4 < 0) { // 비동의한 경우
scores[surveyItem[0]] += score;
} else if (choices[idx] - 4 > 0) { // 동의한 경우
scores[surveyItem[1]] += score;
}
})
const types = {
"R": "T",
"C": "F",
"J": "M",
"A": "N",
}
let result = [];
Array.from("RCJA").forEach((char) => {
if (scores[types[char]] > scores[char]) result.push(types[char]);
else result.push(char);
})
return result.join('');
}
function solution(survey, choices) {
let answer = '';
// 각 타입 별로 점수를 저장하기 위해 해시를 사용합니다.
const type = {
"R" : 0,
"T" : 0,
"C" : 0,
"F" : 0,
"J" : 0,
"M" : 0,
"A" : 0,
"N" : 0
};
survey.forEach(([n, y], i) => {
// 1~3 은 비동의 5~7은 동의, 그런데 1~4은 작은쪽이 높은 점수를 부여하므로 다른 로직을 적용했어요.
const score = choices[i] > 4 ? (choices[i] % 4) : (4 - choices[i]);
// 동의일 경우 두번째 캐릭터 타입에 점수 부여
if(choices[i] > 4){
type[y] += score;
}
// 비동의일 경우 첫번째 캐릭터 타입에 점수 부여
else{
type[n] += score;
}
});
// 이제 총 점수를 비교하여 성격유형을 결정합니다.
// 문제가 좀 배려를 해준게 유형마다 사전순으로 앞서는 문자를 앞에다가 두어서 편했습니다.
// 동점일 경우 사전순으로 앞서는 문자가 오도록 코드를 작성해줍니다.
if(type["R"] >= type["T"]) answer += "R"; else answer += "T";
if(type["C"] >= type["F"]) answer += "C"; else answer += "F";
if(type["J"] >= type["M"]) answer += "J"; else answer += "M";
if(type["A"] >= type["N"]) answer += "A"; else answer += "N";
return answer;
}
// 사실 저는 한번 풀었던 문제에요.. 처음 풀때는 좀 오래걸렸어요.
// 빨리 푸는게 관건인것 같아요.
// 문제가 굉장히 길어서 읽는데만 한참 걸렸었습니다..
//일단 문제 이해하는데 20분 걸린 것 같습니다😱😱 근데 문제만 잘 이해하면 풀 수 있는 문제 같아요!
function solution(survey, choices) {
let result = [];
//성격 유형 객체 생성
const pType = { R: 0, T: 0, C: 0, F: 0, J: 0, M: 0, A: 0, N: 0 };
//선택지(choices 값)가 3이하면 비동의 영역이므로 survey 값의 첫번째 성격 유형의 값에 점수를 추가해줍니다
//나머지 경우는 survey 값의 두번째 성격 유형의 값에 점수를 추가해줍니다
// 선택지가 4인 경우는 결국 점수가 0이므로 따로 생각 안해도 됩니다.
for (let i = 0; i < choices.length; i++) {
choices[i] <= 3 ? (pType[survey[i][0]] += Math.abs(choices[i] - 4)) : (pType[survey[i][1]] += Math.abs(choices[i] - 4));
}
//지표별로 두번째 성격유형이 첫번째 성격유형 값보다 크면 배열에 추가해줍니다
//구현 성공은 했지만 밑의 코드는 뭔가 마음에 안드네요.. 뭔가 성격 유형이 더 늘어나게 되면 사용하지 못할 것 같아요
//혹시 더 예쁘고 클린하게 바꿀 수 있는 방법을 아신다면 꼭 알려주세요🙏
pType["T"] > pType["R"] ? result.push("T") : result.push("R");
pType["F"] > pType["C"] ? result.push("F") : result.push("C");
pType["M"] > pType["J"] ? result.push("M") : result.push("J");
pType["N"] > pType["A"] ? result.push("N") : result.push("A");
return result.join("");
}