2020 카카오 인턴쉽 문제로 근래에 풀어본 문제 중 가장 어려웠다.
첫 구현까지는 1시간 30분 정도 걸렸고.... 모든 케이스를 맞추기까지는 3시간이 걸렸다...
한 번에 로직을 짜기도 쉽지 않고 List값을 삭제하면 List의 사이즈가 계속 달라지는데
이를 어떻게 처리할지 대부분의 시간을 쏟았다. 또, 아무 생각 없이 변수들을 int로 만들어서
테스트 케이스에서 계속 70점을 받았는데 이를 long으로 고치니 결국 모두 통과되었다.
시작부터 long answer = 0이라는 힌트도 있었고 문제에 중간 계산 값이 2^63이라는 것도
쓰여있었는데 계속 실수하는 것 같다.
모든 연산자 배열을 나는 직접 입력했지만, 다른분들은 순열을 이용해서 배열을 생성했다.
확장성을 고려한다면 이 방법이 맞다고 생각이 들어 다시 리펙터링 해볼 계획이다.
최종 코드
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.StringTokenizer;
class Solution {
public long solution(String expression) {
long answer = 0;
// 분리한 문자열을 담을 리스트
LinkedList<String> list = new LinkedList<>();
// 최종 연산 결과를 담을 리스트
ArrayList<Long> resultList = new ArrayList<>();
// StringTokenizer를 이용하여 문자열을 숫자와 연산자로 분리
StringTokenizer st = new StringTokenizer(expression, "+-*", true);
while (st.hasMoreTokens()) {
list.add(st.nextToken());
}
// 모든 연산자 배열
String[][] arr = {{"+", "-", "*"}, {"+", "*", "-"}, {"-", "+", "*"},
{"-", "*", "+"}, {"*", "+", "-"}, {"*", "-", "+"}};
for (int j = 0; j < arr.length; j++) {
// 분리한 문자열을 복사
LinkedList<String> listTemp = new LinkedList<>(list);
for (int k = 0; k < arr[k].length; k++) {
for (int i = 0; i < listTemp.size(); i++) {
// 일치하는 연산자가 나온다면
if (listTemp.get(i).equals(arr[j][k])) {
// 중간 계산
String midString = mid(listTemp.get(i - 1), listTemp.get(i), listTemp.get(i + 1));
// 숫자 연산자 숫자 중 첫번째에 반환값으로 바꾸고 나머지 삭제
listTemp.set(i - 1, midString);
listTemp.remove(i);
listTemp.remove(i);
// 삭제로 인해 리스트의 사이즈가 바뀌므로 i—-
i—-;
}
}
}
// 연산자 배열의 연산이 종료될때마다 결과 리스트에 추가
resultList.add(Math.abs(Long.parseLong(listTemp.get(0))));
}
// 결과 리스트중 최댓값을 출력
answer = Collections.max(resultList);
return answer;
}
// 중간 계산을 위한 메서드
static String mid(String s1, String s2, String s3) {
long temp = 0;
if (s2.equals("+")) {
temp += Long.parseLong(s1) + Long.parseLong(s3);
} else if (s2.equals("-")) {
temp += Long.parseLong(s1) - Long.parseLong(s3);
} else {
temp += Long.parseLong(s1) * Long.parseLong(s3);
}
return String.valueOf(temp);
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 백준 1931 - 회의실 배정 (0) | 2022.06.14 |
---|---|
(Java) 프로그래머스 카카오 프렌즈 컬러링북 (0) | 2022.06.12 |
(Java) 백준 1620 - 나는야 포켓몬 마스터 이다솜 (0) | 2022.06.10 |
(Java) 백준 1764 - 듣보잡 (0) | 2022.06.09 |
(Java) 백준 1697 - 숨바꼭질 (0) | 2022.06.08 |