문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/118666
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
핵심 정리
1. 구해야하는 것 : 검사자의 성격 유형 검사 결과 (지표 번호 순서 순)
2. 입력 - survey : survey 배열의 각 원소는 성격 유형 쌍이다. (e.g., "RT" or "TR")
3. 입력 - choices : choices 배열의 각 원소는 검사자가 선택한 질문의 선택지이다. 동의하는 정도가 1~7까지의 범위로 나누어져있다.
- 1~3 은 비동의를 나타낸다. 이는 성격 유형 쌍에서 전자가 해당한다.
- 4는 중립
- 5~7은 동의를 나타낸다. 이는 성격 유형 쌍에서 후자가 해당한다.
4. 필요한 것: 성격 유형 배열 => 검사 결과 점수를 저장할 배열이다.
풀이
function solution(survey, choices) {
const score = [3,2,1,0,1,2,3];
const types = {R:0, T:0, C:0, F:0, J:0, M:0, A:0, N:0};
//검사 결과 저장
survey.forEach((item, idx) => {
const [first, second] = item;
const choice = choices[idx]; //해당 선택지
if(choice < 4){
types[first] += score[choice-1];
} else if (choice > 4) {
types[second] += score[choice-1];
}
});
//지표 별 점수 비교
const answer = [
types.R >= types.T ? 'R' : 'T',
types.C >= types.F ? 'C' : 'F',
types.J >= types.M ? 'J' : 'M',
types.A >= types.N ? 'A' : 'N'
];
return answer.join('');
}
회고
- 처음에는 성격 유형 배열을 2차원 배열로 구성하려 해서 생각이 꼬였었다. 각 지표 당 비교해야하니까 지표 별로 배열을 또 만들었기 때문이다. 굳이 잘게 나눠서 배열에 담을 필요가 없었는데.. 자료 구조를 단순하게 구성하고, 계산에서 복잡한 부분을 해결할 수 있게 해야겠다.
- 또 지표 별 결과를 계산하는 부분에서 types[R] 이런 식으로 표기했었는데, 실행 오류로 ReferenceError: R is not defined가 발생했다. R이 변수로 선언되지 않았기 때문이였다.
이러한 '대괄호 표기법'은 속성 이름이 동적으로 결정하거나, 변수에 기반에 접근해야하는 경우에만 사용할 수 있다.
types[first] += score[choice - 1];
이렇게 쓸 수 있었던 이유는 first가 위에서 변수로 선언되었고, 값이 동적으로 결정되기 때문이다.
반면 '점 표기법'은 정적 속성을 접근할 때 사용한다.
따라서 이 부분은 점 표기법을 사용해야한다.
그동안 점 표기법과 대괄호 표기법을 아무때나 쓰고 있었는데 이번에 정리할 수 있었다.☺️
- 카카오에서 냈던 코딩테스트 문제들을 쭉 풀어보고 있는데, 구조 분해 할당을 이용하는 부분이 많은 것 같다.
- forEach에서 index를 쓰면 해당 인덱스를 쉽게 가져올 수 있다.
- Array 인스턴스의 join() 메서드는 새 문자열을 반환한다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] Lv 1. 신규 아이디 추천 - Javascript 풀이 (0) | 2025.01.11 |
---|---|
[프로그래머스] Lv 1. 신고 결과 받기 - Javascript 풀이 (0) | 2025.01.11 |
[프로그래머스] Lv 1. 숫자 문자열과 영단어 - Javascript 풀이 (0) | 2025.01.09 |
[프로그래머스] Lv 1. - 개인정보 수집 유효기간: Javascript 풀이 (1) | 2025.01.08 |
[프로그래머스] Lv 1. - 가장 많이 받은 선물 : Javascript 풀이 (0) | 2025.01.05 |