https://school.programmers.co.kr/learn/courses/30/lessons/118666
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이 (JAVA) - 개선 전
import java.util.*;
class Solution {
public String solution(String[] survey, int[] choices) {
String answer = "";
HashMap<String,Integer> map = new HashMap<>(); // 성격 유형 저장 맵
HashMap<Integer,Integer> choiceMap = new HashMap<>(); // 설문 번호 저장 맵
String [] alphs = {"R","T","C","F","J","M","A","N"}; // 성격 유형 문자 배열
for(int i=0; i<alphs.length; i++){
map.put(alphs[i],0); // 성격 유형 맵 선언 및 초기화
}
// 설문 번호 맵 선언 및 초기화
for(int i=1, j=3; i<8; i++){
if(i<4){
choiceMap.put(i,j);
j--;
}else if(i==4){
choiceMap.put(i,j);
}else if(i>4){
j++;
choiceMap.put(i,j);
}
}
// 성격 유형 점수 저장 로직
for(int i=0; i<survey.length; i++){
String [] values = survey[i].split(""); // values[0] = 왼쪽 문자, values[1] = 오른쪽 문자
int num = choices[i]; // 설문 번호
if(num < 4){
map.put(values[0], map.getOrDefault(values[0],0)+choiceMap.get(num));
}else{
map.put(values[1], map.getOrDefault(values[1],0)+choiceMap.get(num));
}
}
// 성격 유형 결과 저장 로직
for(int i=0; i<alphs.length; i+=2){
String lt = alphs[i];
String rt = alphs[i+1];
if(map.get(lt) > map.get(rt)){
answer = answer + lt;
}else if(map.get(lt) < map.get(rt)){
answer = answer + rt;
}else if(map.get(lt) == map.get(rt)){
if((int)lt.toCharArray()[0] > (int)rt.toCharArray()[0]){
answer = answer + rt;
}else{
answer = answer + lt;
}
}
}
return answer;
}
}
문제 풀이 (JAVA) - 개선 후(코드 리팩토링)
import java.util.*;
class Solution {
public String solution(String[] survey, int[] choices) {
String answer = "";
HashMap<String,Integer> map = new HashMap<>(); // 성격 유형 저장 맵
String [] alphs = {"R","T","C","F","J","M","A","N"}; // 성격 유형 문자 배열
for(int i=0; i<alphs.length; i++){
map.put(alphs[i],0); // 성격 유형 맵 선언 및 초기화
}
// 성격 유형 점수 저장 로직
for(int i=0; i<survey.length; i++){
String [] values = survey[i].split(""); // values[0] = 왼쪽 문자, values[1] = 오른쪽 문자
int num = choices[i]; // 설문 번호
if(num < 4){
map.put(values[0], map.get(values[0]) + 4 - num);
}else{
map.put(values[1], map.get(values[1]) + num - 4);
}
}
// 성격 유형 결과 저장 로직
for(int i=0; i<alphs.length; i+=2){
String lt = alphs[i];
String rt = alphs[i+1];
if(map.get(lt) > map.get(rt)){
answer = answer + lt;
}else if(map.get(lt) < map.get(rt)){
answer = answer + rt;
}else if(map.get(lt) == map.get(rt)){
if((int)lt.toCharArray()[0] > (int)rt.toCharArray()[0]){
answer = answer + rt;
}else{
answer = answer + lt;
}
}
}
return answer;
}
}
리팩토링 설명
: 처음 문제를 풀때 설문 번호에 따른 점수에서 규칙을 찾았지만, 활용 할 방법을 생각하지 못하여 choiceMap 해시맵 변수를 선언하여 (key,value) 형식으로 저장하였다. 문제를 다 풀고 다른 사람의 풀이를 보고 나서 불필요한 변수라는 것을 알았다.
기존에 성격 유형 점수를 저장하는 로직을
map.put(values[0], map.getOrDefault(values[0],0)+choiceMap.get(num)); -- 변경 전
map.put(values[1], map.getOrDefault(values[1],0)+choiceMap.get(num));
map.put(values[0], map.get(values[0]) + 4 - num); -- 변경 후
map.put(values[1], map.get(values[1]) + num - 4);
위와 같이 번호의 숫자가 4보다 작을때는 (기존값 + 4 - 설문번호),
번호의 숫자가 4보다 같거나 클경우 (기존값 + 설문번호 - 4) 의 규칙으로 점수를 매길 수 있었다.
때문에 설문 번호 맵을 선언하고 초기화하는 불필요한 로직을 제거하여 보다 짧은 코드로 문제를 해결 할 수 있다는 것을 알았다.
결론
: 2022 카카오 인턴쉽 레벨 1 문제인데, 생각보다 어려웠다... 카카오는 알고리즘을 응용한 구현 문제가 출제 되므로 많이 풀어봐야겠다는 생각을 하였다.
'프로그래머스(JAVA)' 카테고리의 다른 글
게임 맵 최단거리(BFS) (0) | 2023.04.23 |
---|---|
네트워크(인접리스트-DFS) (0) | 2023.04.23 |
체육복 (3) | 2022.07.18 |
K번째 수 (0) | 2022.07.18 |
구명 보트 (0) | 2022.07.16 |