자료구조 및 알고리즘/JavaScript Practice

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

Ryomi 2025. 1. 23. 12:50
728x90
반응형

문제 설명

 

문제 분석

  • 각 지표는 두 가지 성격 유형으로 구성됩니다. (RT, CF, JM, AN)
  • 검사지(survey)와 선택지(choices) 배열이 주어집니다.
  • choices는 1-7 사이의 값으로, 4를 기준으로 어느 성격 유형에 점수를 줄지 결정합니다.
  • 각 지표에서 점수가 같으면 사전순으로 빠른 유형이 선택됩니다.

 

첫 번째 접근: O(n)

function solution(survey, choices) {
    const character = {
        RT: { R: 0, T: 0 },
        CF: { C: 0, F: 0 },
        JM: { J: 0, M: 0 },
        AN: { A: 0, N: 0 },
    }
    
    survey.forEach((el, i) => {
        const [l1, l2] = el.split('')
        const position = character[el] ? character[el] : character[l2 + l1]
        const target = choices[i] < 4 ? l1 : l2
        
        position[target] += Math.abs(4 - choices[i])
    })
    
    return Object.values(character).map(obj => {
        const [[k1, v1], [k2, v2]] = Object.entries(obj)
        return v1 >= v2 ? k1 : k2
    }).join('')
}

 

  • 중첩 객체 구조(character)를 사용한 접근
  • 복잡한 구조로 가독성 감소

 

두 번째 접근: O(n)

function solution(survey, choices) {
    const types = ['RT', 'CF', 'JM', 'AN']
    const character = {
        R: 0, T: 0,
        C: 0, F: 0,
        J: 0, M: 0,
        A: 0, N: 0,
    }
    
    survey.forEach((el, i) => {
        const target = choices[i] > 4 ? el[1] : el[0]
        character[target] += Math.abs(4 - choices[i])
    })
    
    return types.map(([a, b]) => character[a] >= character[b] ? a : b).join('')
}
  • 평면적인 객체 구조(character) 사용
  • types 배열로 지표 쌍을 명시적으로 관리
  • 점수 계산 로직 단순화

 

개선된 해결책( O(n) )

function solution(survey, choices) {
	// Math.abs() 제거
    const scores = {
        1: 3, 2: 2, 3: 1, 4: 0, 5: 1, 6: 2, 7: 3
    }
    
    const character = {
         R: 0, T: 0,
         C: 0, F: 0,
         J: 0, M: 0,
         A: 0, N: 0,
    }
    
    survey.forEach((el, i) => {
        const target = choices[i] > 4 ? el[1] : el[0]
        character[target] += scores[choices[i]]
    })
    
     return 'RCJA'.split('')
       .map(a => {
           const b = { R:'T', C:'F', J:'M', A:'N' }[a]
           return character[a] >= character[b] ? a : b
       }).join('')
}

개선 사항

 

  • scores 객체로 점수 계산 로직 단순화
  • Math.abs() 제거하여 성능 향상
  • 하드코딩된 types 배열 대신 'RCJA' 문자열 사용
  • 조건부 연산자로 코드 간소화

 

728x90
반응형