풀이
김영준
// 각 성격유형을 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(""); }