728x90
이해하기
처음 문제를 봤을 때 Map으로 풀어야하나 했지만 구현 방법이 잘 떠오르지 않아서 노가다로 풀었다.
class Solution {
public String solution(String[] survey, int[] choices) {
StringBuffer sb = new StringBuffer();
int[][] arr = new int[4][2];
for (int i = 0; i < survey.length; i++) {
String s = survey[i];
int choice = choices[i];
if (s.contains("R")) {
if (s.startsWith("R")) {
if (choice <= 3) {
arr[0][0] += 3 - choice + 1;
} else if (choice >= 5) {
arr[0][1] += choice - 4;
} else {
continue;
}
} else {
if (choice <= 3) {
arr[0][1] += 3 - choice + 1;
} else if (choice >= 5) {
arr[0][0] += choice - 4;
} else {
continue;
}
}
} else if (s.contains("C")) {
if (s.startsWith("C")) {
if (choice <= 3) {
arr[1][0] += 3 - choice + 1;
} else if (choice >= 5) {
arr[1][1] += choice - 4;
} else {
continue;
}
} else {
if (choice <= 3) {
arr[1][1] += 3 - choice + 1;
} else if (choice >= 5) {
arr[1][0] += choice - 4;
} else {
continue;
}
}
} else if (s.contains("J")) {
if (s.startsWith("J")) {
if (choice <= 3) {
arr[2][0] += 3 - choice + 1;
} else if (choice >= 5) {
arr[2][1] += choice - 4;
} else {
continue;
}
} else {
if (choice <= 3) {
arr[2][1] += 3 - choice + 1;
} else if (choice >= 5) {
arr[2][0] += choice - 4;
} else {
continue;
}
}
} else {
if (s.startsWith("A")) {
if (choice <= 3) {
arr[3][0] += 3 - choice + 1;
} else if (choice >= 5) {
arr[3][1] += choice - 4;
} else {
continue;
}
} else {
if (choice <= 3) {
arr[3][1] += 3 - choice + 1;
} else if (choice >= 5) {
arr[3][0] += choice - 4;
} else {
continue;
}
}
}
}
for (int i = 0; i < arr.length; i++) {
if (i == 0) {
sb.append((arr[i][0] >= arr[i][1]) ? "R" : "T");
} else if (i == 1) {
sb.append((arr[i][0] >= arr[i][1]) ? "C" : "F");
} else if (i == 2) {
sb.append((arr[i][0] >= arr[i][1]) ? "J" : "M");
} else {
sb.append((arr[i][0] >= arr[i][1]) ? "A" : "N");
}
}
return sb.toString();
}
}
엄청 길어졌는데 정리하자면 아래와 같다.
- 문자열을 저장할 StringBuffer
- 각 설문조사의 결과를 저장할 int[][] arr
- 4가지 지표에 두 가지 결과라서 new int[4][2]
- for문으로 survey를 하나씩 돌면서 choice값을 확인
- "R"이 있다면 1번 지표
- 그 중에서도 "R"로 시작한다면
- 1, 2, 3 choice값이 "R"에 해당
- 5, 6, 7 choice값이 "T"에 해당
- "R"로 시작하지 않는다면 ("T"로 시작한다면)
- 1, 2, 3 choice값이 "T"에 해당
- 5, 6, 7 choice값이 "R에 해당
- 그 중에서도 "R"로 시작한다면
- "C"가 있다면 2번 지표
- 그 중에서도 "C"로 시작한다면
- 1, 2, 3 choice값이 "C"에 해당
- 5, 6, 7 choice값이 "F"에 해당
- "C"로 시작하지 않는다면 ("F"로 시작한다면)
- 1, 2, 3 choice값이 "F"에 해당
- 5, 6, 7 choice값이 "C"에 해당
- 그 중에서도 "C"로 시작한다면
- "J"가 있다면 3번 지표
- 그 중에서도 "J"로 시작한다면
- 1, 2, 3 choice값이 "J"에 해당
- 5, 6, 7 choice값이 "M"에 해당
- "J"로 시작하지 않는다면 ("M"으로 시작한다면)
- 1, 2, 3 choice값이 "M"에 해당
- 5, 6, 7 choice값이 "J"에 해당
- 그 중에서도 "J"로 시작한다면
- 전부 다 아니면 4번 지표
- 그 중에서도 "A"로 시작한다면
- 1, 2, 3 choice값이 "A"에 해당
- 5, 6, 7 choice값이 "N"에 해당
- "A"로 시작하지 않는다면 ("N"으로 시작한다면)
- 1, 2, 3 choice값이 "N"에 해당
- 5, 6, 7 choice값이 "A"에 해당
- 그 중에서도 "A"로 시작한다면
- "R"이 있다면 1번 지표
- for문으로 arr를 확인
- i == 0이면 1번 지표
- arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "R"을 append, 아니면 "T"를 append
- i == 1이면 2번 지표
- arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "C"을 append, 아니면 "F"를 append
- i == 2이면 3번 지표
- arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "J"을 append, 아니면 "M"를 append
- 전부 아니면 4번 지표
- arr[i][0]과 arr[i][1]을 비교해서 arr[i][0] >= arr[i][1] 이라면 "A"을 append, 아니면 "N"를 append
- i == 0이면 1번 지표
통과도 하고 시간도 빨랐지만 문제에서 원한 풀이가 이게 아니라는 생각이 들었다.
참고한 블로그⬇️
문제풀이
import java.util.*;
class Solution {
public String solution(String[] survey, int[] choices) {
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < survey.length; i++) {
int value = choices[i];
if (value > 0 && value < 4) {
char ch = survey[i].charAt(0);
map.put(ch, map.getOrDefault(ch, 0) + 4 - value);
} else if (value > 4) {
char ch = survey[i].charAt(1);
map.put(ch, map.getOrDefault(ch, 0) + value - 4);
}
}
return new StringBuffer()
.append(map.getOrDefault('R', 0) >= map.getOrDefault('T', 0) ? 'R' : 'T')
.append(map.getOrDefault('C', 0) >= map.getOrDefault('F', 0) ? 'C' : 'F')
.append(map.getOrDefault('J', 0) >= map.getOrDefault('M', 0) ? 'J' : 'M')
.append(map.getOrDefault('A', 0) >= map.getOrDefault('N', 0) ? 'A' : 'N')
.toString();
}
}
- HashMap 사용
- for문으로 하나씩 돌면서
- choices[i]를 value로 잡고
- value가 1, 2, 3 중 하나라면
- ch = survey[i].charAt(0)
- e.g. "TR"이면 앞의 'T'를 가져온 것
- map.put(ch, map.getOrDefault(ch, 0) + 4 - value)
- value가 5 이상이라면
- ch = survey[i].charAt(1)
- e.g. "TR"이면 뒤의 'R'을 가져온 것
- map.put(ch, map.getOrDefault(ch, 0) + value - 4)
- value가 1, 2, 3 중 하나라면
- choices[i]를 value로 잡고
- 각 지표의 두 개의 char의 value를 map에서 가져와서 비교 후 더 큰 값을 append
이게 문제에서 원했던 풀이라는 느낌...^^
첫번째 풀이랑 비교해보면 아주 쪼끔 느리지만 여전히 빠르다.
'JAVA > Coding Test Study' 카테고리의 다른 글
[Lv.0] 프로그래머스 - 문자열 잘라서 정렬하기 : Java (0) | 2024.05.10 |
---|---|
[Lv.1] 프로그래머스 - 햄버거 만들기 : Java (0) | 2024.05.10 |
[프로그래머스] 코딩 기초 트레이닝 Lv.0 클리어! (0) | 2024.04.30 |
[Lv.0] 프로그래머스 - 정수를 나선형으로 배치하기 : Java (0) | 2024.04.30 |
[Lv.0] 프로그래머스 - 무작위로 K개의 수 뽑기 : Java (0) | 2024.04.30 |