프라이D
프라이Develog(❁´◡`❁)
프라이D
전체 방문자
오늘
어제
  • ALL (378)
    • TDD, Cleancode with JavaScr.. (5)
    • 프로젝트 (32)
      • work (3)
      • 직접 만드는 기술 블로그 (2)
      • 데일리 옥션 (19)
      • 모락모락 (8)
    • Computer Science (1)
    • Algorithm & 자료구조 (94)
      • 알고리즘 w.JavaScript (53)
      • 자료구조 (5)
      • (인프런) 자바스크립트 알고리즘 문제풀이 (34)
    • JavaScript (45)
      • JavaScript (41)
      • 모던 자바스크립트 Deep Dive (4)
    • WEB (13)
    • 회고 (12)
    • TIL (109)
    • WIL (7)
    • Stacks (20)
      • React.js (6)
      • Next.js (1)
      • Redux (3)
      • Node.js (2)
      • GIT (2)
      • SAP (1)
    • 15일 메이킹 프로젝트 (15)
    • 이전 기록 (14)
    • ETC. (5)
    • ---------------2021 (6)
      • 내일배움단-웹개발 5주 (2)
      • 정보처리기사 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 코딩프로젝트
  • 모던자바스크립트딥다이브
  • 자바스크립트알고리즘
  • JavaScript
  • 비트마스크
  • nomadcoder
  • 국비지원
  • vanilaJS
  • 내일배움카드
  • MySQL
  • 내일배움단
  • 코드스테이츠
  • 스파르타코딩클럽
  • 알고리즘
  • 투포인터알고리즘
  • 자바스크립트비트마스크
  • nomadcoders
  • 자바스크립트
  • 2023 인프콘 후기
  • Til

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
프라이D

프라이Develog(❁´◡`❁)

Algorithm & 자료구조/알고리즘 w.JavaScript

[알고리즘 JS] 성격 유형 검사하기 (프로그래머스 Lv.1)

2023. 1. 15. 23:11

문제

https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

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

programmers.co.kr

  • 검사지에 총 N개의 질문, 각 질문마다 7개의 선택지 존재함
  • 각 지표별 점수를 계산해서 성격 유형을 출력하는 문제

풀이(정답)

function solution(survey, choices) {
  let answer = '';
  
  // 4개의 지표를 연관되는 순으로 객체 쌍으로 만들었다. 
  const indicators = {
    1: {R: 0, T: 0},
    2: {C: 0, F: 0},
    3: {J: 0, M: 0},
    4: {A: 0, N: 0},
  };

  for (let i = 0; i < survey.length; i++) {
     // 선택 결과를 반복하며 두 가지 선택지를 분리한다.
    const [lower, higher] = survey[i].split('');
    let n = 0;
	
    // 현재 문자열에 포함된 문자를 정규표현식으로 확인하여 indicators 객체의 키값을 추출
    if (survey[i].match(/R/g)) n = 1;
    if (survey[i].match(/C/g)) n = 2;
    if (survey[i].match(/J/g)) n = 3;
    if (survey[i].match(/A/g)) n = 4;

    // lower +1
    if (choices[i] < 4) {
      indicators[n][lower] += Math.abs(choices[i] - 4);
    }
    // higher +1
    else if (choices[i] > 4) {
      indicators[n][higher] += Math.abs(choices[i] - 4);
    } else {
    }
  }
 
  // 카운트가 더해진 indicator 객체를 돌며 정답을 구한다.
  for (let indicator of Object.values(indicators)) {
    const key = Object.keys(indicator);
    const [lower, higher] = key;
    if (indicator[lower] >= indicator[higher]) answer += lower;
    else answer += higher;
  }

  return answer;
}
  • 4개의 지표에 각각 두 가지 문자열을 포함하고 있으므로 4개씩 짝지어 객체를 만들었다.

다른 풀이

function ref(survey, choices) {
  const MBTI = {};
  const types = ['RT', 'CF', 'JM', 'AN'];

  // forEach문을 활용해 각 지표와 점수를 계산하는 해시맵 생성
  types.forEach(type => type.split('').forEach(char => (MBTI[char] = 0)));

  choices.forEach((choice, index) => {
    // 동의, 비동의 지표를 구조분해할당
    const [disagree, agree] = survey[index];

	// 점수가 4이상 인지 확인하여 해당하는 문자열로 접근하여 절댓값을 합산
    MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
  });

  // 4지표를 짝지어둔 types 배열을 돌며 크기를 비교하여 정답을 구한다.
  return types.map(([a, b]) => (MBTI[b] > MBTI[a] ? b : a)).join('');
}
  • 2개의 문자열이 짝지어져 있는 부분이 애매했는데, 배열과 구조분해할당, 삼항 연산자를 적절히 활용해 훨씬 간편하게 푼 것 같다. map을 돌면서 해당 요소를 구조분해할당 할 수 있을거라고는 생각을 못했는데 새로운 접근.

 

저작자표시 (새창열림)

'Algorithm & 자료구조 > 알고리즘 w.JavaScript' 카테고리의 다른 글

[알고리즘 JS] 신고 결과 받기 (프로그래머스 Lv.1)  (0) 2023.01.17
[알고리즘 JS] 햄버거 만들기 (프로그래머스 Lv.1)  (3) 2023.01.16
[알고리즘 JS] 숫자 짝꿍 (프로그래머스 Lv.1)  (1) 2023.01.02
[알고리즘 JS] 로또의 최고 순위와 최저 순위 (프로그래머스 Lv.1)  (0) 2022.11.16
[알고리즘 JS] 다트 게임 (프로그래머스 Lv.1)  (0) 2022.11.15
    'Algorithm & 자료구조/알고리즘 w.JavaScript' 카테고리의 다른 글
    • [알고리즘 JS] 신고 결과 받기 (프로그래머스 Lv.1)
    • [알고리즘 JS] 햄버거 만들기 (프로그래머스 Lv.1)
    • [알고리즘 JS] 숫자 짝꿍 (프로그래머스 Lv.1)
    • [알고리즘 JS] 로또의 최고 순위와 최저 순위 (프로그래머스 Lv.1)
    프라이D
    프라이D
    틀린내용 정정 및 개선사항은 언제든지 댓글 달아주세요 :D

    티스토리툴바