[프로그래머스] 성격유형 검사하기

SeHoony·2022년 8월 18일
1

코테준비

목록 보기
8/27

1. 문제

성격유형검사하기 lv1
https://school.programmers.co.kr/learn/courses/30/lessons/118666

2. 기존 풀이

function solution(survey, choices) {
    var answer = '';
    let arr = []
    let scores = {R:0, T:0, C:0, F:0, J:0, M :0, A:0, N:0}
    
    survey.map((e,i) => {
        if(choices[i] >4){
            scores[e[1]] +=(choices[i]-4)
        }
        else if(choices[i]<4){
            scores[e[0]] += (4-choices[i])
        }
        else{
            return true
        }
    })
    
    if(scores['R'] >= scores['T']){
        arr.push('R')
    }
    else{
        arr.push('T')
    }
    
    if(scores['C'] >= scores['F']){
        arr.push('C')
    }
    else{
        arr.push('F')
    }
    
    if(scores['J'] >= scores['M']){
        arr.push('J')
    }
    else{
        arr.push('M')
    }
    
    if(scores['A'] >= scores['N']){
        arr.push('A')
    }
    else{
        arr.push('N')
    }
    answer = arr.join('')
    
    return answer;
}

이 방식은 탐색할 배열의 최대 길이가 1000밖에 안되어서 가능한 풀이다.
절대 좋은 풀이가 아니다.
그러다가 나처럼 푼 사람들도 있었지만,
몇몇 사람들이 Map 자료구조를 이용해서 풀었음을 확인했다.

3. Map 자료구조

MDN 페이지를 참고로 하여 공부했는데 특히 키 기반의 컬렉션의 내용이 좋았다. 이 부분을 위주로 내용을 정리해보고자 한다.

3-1. 정의

  • key, value 기준으로 정렬되는 자료구조
  • ECMAScript 6에서 소개
  • 저장된 순서대로 각 요소들을 반복적으로 접근

3-2. 기능(함수)

  • new Map()
  • set(key, value)
  • get(key)
  • has(key)
  • delete(key)
  • size
  • for(const [key, value] of Map){}

3-3. Object vs Map

참고 자료 : Map vs Object in JavaScript

  • Object는 Key가 String, integer, symbol로 한정,Map은 Key가 모든 값 가능
  • Map은 key의 순서 보존
  • 더 알아봐야겠지만 Object는 Javascript에서 기본적으로 제공하는 자료구조이기 때문에 훨씬 성능이 좋다고 평가받는다. 그래서 빠르다.

4. 개선 코드?

위의 코드나 밑의 코드나 가독성에서 차이가 날 뿐 거의 똑같은 로직이다.
이번에 Map이라는 자료구조를 한 번 써본 좋은 경험이라고 생각하면 좋다.

function solution(survey, choices) {
    var answer = '';
    const scores = new Map()
    const arr = ['R','T','C','F','J','M','A','N']
    arr.map(e => scores.set(e,0))
    
    survey.map((e,i)=> {
        if(choices[i] < 4){
            scores.set(e[0],scores.get(e[0]) + (4-choices[i]))
        }
        else if(choices[i] > 4){
            scores.set(e[1],scores.get(e[1]) + (choices[i]-4))
        }
        else{
            return true
        }
    })
    
    answer += scores.get('R') >= scores.get('T') ? 'R' : 'T'
    answer += scores.get('C') >= scores.get('F') ? 'C' : 'F'
    answer += scores.get('J') >= scores.get('M') ? 'J' : 'M'
    answer += scores.get('A') >= scores.get('N') ? 'A' : 'N'
    return answer;
}
profile
두 발로 매일 정진하는 두발자, 강세훈입니다. 저는 '두 발'이라는 이 단어를 참 좋아합니다. 이 말이 주는 건강, 정직 그리고 성실의 느낌이 제가 주는 분위기가 되었으면 좋겠습니다.

0개의 댓글