-
프로그래머스 : 성격 유형 검사하기코딩테스트 문제 풀이/프로그래머스 2023. 11. 21. 00:01
다른사람 코드
import java.util.HashMap; class Solution { public String solution(String[] survey, int[] choices) { String answer = ""; char[][] arrChar = new char[][]{{'R', 'T'}, {'C', 'F'}, {'J', 'M'}, {'A', 'N'}}; int[] points = new int[]{0, 3, 2, 1, 0, 1, 2, 3}; HashMap<Character, Integer> tbl = new HashMap(); for (char[] c: arrChar) { tbl.put(c[0], 0); tbl.put(c[1], 0); } for (int i = 0; i < choices.length; i++) { char type = (choices[i] > 4) ? survey[i].charAt(1) : survey[i].charAt(0); tbl.put(type, tbl.get(type) + points[choices[i]]); } for (char[] c: arrChar) { answer += tbl.get(c[0]) >= tbl.get(c[1]) ? c[0] : c[1]; } return answer; } }
이번에 가져온 다른 사람의 코드는 나에겐 배울 점이 많아보이는 코드였다. 이 코드를 해석해보면서 문제에 대해 어떻게 접근했는지 배워봐야겠다. 🤓
1. 사용할 변수들 생성 & 초기화
// 지표 2차 배열로 생성 // ➡️ 각 점수가 매겨지는 지표를 char 타입으로 각각 배열에 담음 char [][] type = {{'R', 'T'}, {'C', 'F'}, {'J', 'M'}, {'A', 'N'}}; // choices 숫자 별 점수를 배열로 등록 // ➡️ choices가 1~7 이기 때문에 계산하기 편하게 인덱스 1~7까지 해당되는 점수로 저장 int [] score = {0, 3, 2, 1, 0, 1, 2, 3}; // 점수 기록할 배열 생성 : HashMap<Character, Integer> point // 점수 기록할 배열 초기화 : 모든 하나의 타입을 key로 하여 value를 0으로 초기화 HashMap<Character, Integer> point = new HashMap<Character, Integer>(); for (char[] t : type) { point.put(t[0], 0); point.put(t[1], 0); }
2. 점수 기록
// 점수를 별도로 계산할 필요 없이, 위에서 만들어둔 score배열을 바로 가져다가 사용할 수 있음. // 단, 이때 점수를 등록할 타입이 0점이 아닐 수 있기때문에 get한 값과 더해서 저장해줌 for (int idx = 0; idx < choices.length; idx++){ if(choices[idx] > 4){ // 키는 choices가 4보다 크면 뒤쪽 타입에 대한 값이기 때문에 charAt(1)만 있으면 됨 point.put(survey[idx].charAt(1), point.get(survey[idx].charAt(1)) + score[choices[idx]]); } else { // 키는 choices가 4보다 작으면 앞쪽 타입에 대한 값이기 때문에 charAt(0)만 있으면 됨 point.put(survey[idx].charAt(0), point.get(survey[idx].charAt(0)) + score[choices[idx]]); } }
3. 지표 별 점수 비교 후 유형 기입
// point에서 t[1]과 t[2]의 값을 비교해서 더 큰 값이 나오는 t를 answer에 기록 for (char[] t : type) { answer += (point.get(t[1]) <= point.get(t[0])) ? t[0] : t[1]; }
내 코드
import java.util.*; class Solution { public String solution(String[] survey, int[] choices) { String answer = ""; String[] arrS = new String[]{"RT","CF","JM","AN"}; HashMap<String, Integer[]> table = new HashMap(); for (String s: arrS) { table.put(s, new Integer[]{0,0}); } int idx = 0; Integer[] temp; for (String s: survey) { if (choices[idx] != 4) { if (s.contains("R")) temp = table.get("RT"); else if (s.contains("C")) temp = table.get("CF"); else if (s.contains("J")) temp = table.get("JM"); else temp = table.get("AN"); int idxType; if (s.charAt(0) == 'R' || s.charAt(0) == 'C' || s.charAt(0) == 'J' || s.charAt(0) == 'A' ) { idxType = choices[idx] > 4 ? 1 : 0; } else { idxType = choices[idx] > 4 ? 0 : 1; } if (choices[idx] > 4) { temp[idxType] += choices[idx] - 4; } else { temp[idxType] += 4 - choices[idx]; } table.put(s, temp); } idx++; } for (String s : arrS) { temp = table.get(s); if (temp[0] >= temp[1]) answer += s.charAt(0); else answer += s.charAt(1); } return answer; } }
흐으으으으음..
🔻접근 방식을 계산했던 메모 첨부..
이렇게 긴 문제는 처음 풀어봐서 문제 읽으면서 깜짝 놀랐다. 문제 풀면서 메모를 시작한건 예전에도 몇번 해보긴 했지만 즉흥적?으로 필요에 의해서 했던거고 계획적인 메모와 어떻게 메모할지 생각해보고 한적이 없었다. 이번 문제부터는 꼭 메모하면서 생각을 정리하고 코드의 풀이 방향을 함께 메모하면서 풀어보려고 했는데 생각보다 어려웠다..!!!!
그래도 메모를 해놓고 생각을 정리한 후 코드를 작성했더니, 메모하지 않고 키보드부터 두드릴때와는 다르게 길을 잃지 않고 두세번만에 통과하는 코드를 작성할 수 있었다. (그래도 놓치는 부분이 있었다는것.. 하하!;) 어제까지만해도 정말 간단한 문제가 아니고서야 최소 8번 정도는 도전했어야 통과하는 수준이었는데.. 메모를 잘 사용해봐야겠다는 생각이 들었다!
코드 작성하면서 새롭게 깨닫게 된 부분
int[] a = new int[2]; // 이렇게 배열을 생성하면 배열의 자료형이 기본자료형(int)이라서 int의 기본값인 0으로 초기화가 되지만, Integer[] b = new Integer[2]; // 이렇게 생성하게되면 참조자료형타입의 배열이 되기 때문에, 기본 값이 null로 초기화 된다.
처음 풀어본 날 : 23.03.23 다시 풀어본 날 : 23.03.25,26, 30
'코딩테스트 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 : 소수 찾기 (0) 2023.11.21 프로그래머스 : 문자열 내 p와 y의 개수 (0) 2023.11.21 프로그래머스 : K번째 수 (0) 2023.11.21 프로그래머스 : 프린터 (0) 2023.11.20 프로그래머스 : 위장 (0) 2023.11.20