반응형
- 내 풀이
문자열을 char 배열로 만든 후에 처리했다. 처음에 10이 있는 걸 간과하고 하나씩 봤는데 10 때문에 하나씩 보는게 어려웠다. 10인 경우만 따로 빼기엔 복잡해질 것 같아서 문자가 나올 때까지는 숫자에 더하게 했다(score 변수). 중간중간 자꾸 범위 초과 에러가 떴는데 나조차도 헷갈려서 향상된 for문을 사용했더니 오류가 사라졌다. 왜 그랬는지는 아직도 의문..
import java.util.*;
class Solution {
public int solution(String dartResult) {
char[] dart = dartResult.toCharArray();
int[] scoreArr = new int[3];
int round = 0;
String score = "";
for (char ch : dart) {
if (ch == 'S' || ch== 'D' || ch == 'T') {
int area = (ch == 'S' ? 1 : (ch == 'D'? 2 : 3));
scoreArr[round] = (int) Math.pow(Integer.parseInt(score), area);
score = "";
round++;
} else if (ch == '*') {
if (round-1 > 0) {
scoreArr[round-2] *= 2;
}
scoreArr[round-1] *= 2;
} else if (ch == '#') {
scoreArr[round-1] *= -1;
} else {
score += ch;
}
}
return scoreArr[0] + scoreArr[1] + scoreArr[2];
}
}
- 간과했던 점
char 형을 int 형으로 바꿀 때에는 아스키코드를 고려해야 한다. '0'을 빼면 원래 생각했던 숫자 그대로가 나온다.
- 첫 시도
import java.util.*;
class Solution {
public int solution(String dartResult) {
int finalScore = 0;
int[] scoreArr = new int[3];
char[] dart = dartResult.toCharArray();
int s = 0;
for (int i = 0; s < 3; ++s, i=i+2) {
int area = (dart[i+1] == 'S' ? 1 : (dart[i+1] == 'D'? 2 : 3));
int score = dart[i] - '0';
scoreArr[s] = (int) Math.pow(score, area);
System.out.println(score + " " + area + " " + scoreArr[s]);
if (i == dart.length - 2) {
break;
}
if (dart[i+2] == '*') {
if (s > 0) {
scoreArr[s-1] *= 2;
}
scoreArr[s] *= 2;
i++;
} else if (dart[i+2] == '#') {
scoreArr[s] *= -1;
i++;
}
}
finalScore = scoreArr[0] + scoreArr[1] + scoreArr[2];
return finalScore;
}
}
- 다른 풀이
스택을 썼다. 아직 스택을 쓰는 게 익숙하지 못한 것 같다. 다만 내 코드보다는 10줄 가량이 긴데, 어떤 코드가 더 좋은 코드인지는 잘 모르겠다.
import java.util.*;
class Solution {
public int solution(String dartResult) {
Stack<Integer> stack = new Stack<>();
int sum = 0;
for (int i = 0; i < dartResult.length(); ++i) {
char c = dartResult.charAt(i);
if (Character.isDigit(c)) {
sum = (c - '0');
if (sum == 1 && i < dartResult.length() - 1 && dartResult.charAt(i + 1) == '0') {
sum = 10;
i++;
}
stack.push(sum);
} else {
int prev = stack.pop();
if (c == 'D') {
prev *= prev;
} else if (c == 'T') {
prev = prev * prev * prev;
} else if (c == '*') {
if (!stack.isEmpty()) {
int val = stack.pop() * 2;
stack.push(val);
}
prev *= 2;
} else if (c == '#') {
prev *= (-1);
}
// System.out.println(prev);
stack.push(prev);
}
}
int totalScore = 0;
while (!stack.isEmpty()) {
totalScore += stack.pop();
}
return totalScore;
}
}
- 해설
카카오 공채 문제이고 지금도 그런지는 모르겠지만 카카오에서 해설을 공개했다. 카카오에서 밝히기로는 난이도가 하 라고..ㅎㅎ 더 열심히 해야겠다.
https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
카카오 신입 공채 1차 코딩 테스트 문제 해설
‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인
tech.kakao.com
반응형
'코딩테스트 연습 > JAVA' 카테고리의 다른 글
[JAVA/알고리즘] 최소직사각형 (0) | 2022.03.15 |
---|---|
[JAVA/알고리즘] 3진법 뒤집기 (0) | 2022.03.14 |
[JAVA/알고리즘] 문자열 내림차순으로 배치하기 (0) | 2022.03.13 |
[JAVA/알고리즘] 이상한 문자 만들기 (0) | 2022.03.12 |
[JAVA/알고리즘] 완주하지 못한 선수 (0) | 2022.03.11 |