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
반응형
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
[프로그래머스] 숫자 짝꿍 (1) | 2025.01.01 |
---|---|
[프로그래머스] 체육복 (0) | 2024.12.31 |
[프로그래머스] 햄버거 만들기 (0) | 2024.12.30 |
[프로그래머스] 해시 - 완주하지 못한 선수 (0) | 2024.12.28 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2024.12.28 |