반응형
문제는 아래 링크를 통해 확인해주세요.
https://programmers.co.kr/learn/courses/30/lessons/17682
조건 및 설계
- 점수 : 0~10
- 보너스 : S(1), D(2), T(3)
- 옵션 : 옵션은 존재하지 않을 수도 있다.
- * : 위치 기준 i와 i-1를 2배 한다. (만약 i=0이라면 i만 2배한다.)
- *와 * 중첩 : 위와 마찬가지로 진행하면 된다. (결국 i-1의 score는 4배가 된 셈이다.)
- #와 * 중첩 : i-1에 대해서 -1배가 적용된 값에 그대로 2배를 적용한다. (-2배)
- # : 위치 기준 i에 -1배 한다.(즉 마이너스)
- * : 위치 기준 i와 i-1를 2배 한다. (만약 i=0이라면 i만 2배한다.)
내 생각
- 길이 3인 int형 배열 score에 값을 넣어주는데..
- input으로 들어오는 dartResult에서 점수 - 보너스 - 옵션 순으로 하나씩 검사하면서 값에 변환을 주면 된다.
- 결국 score 배열 만큼 도는 반복문 내에서 dartResult는 index를 이용해서 하나씩 증가시켜주며 방문한다.
- 숫자 : 10이 나오는 경우를 따로 처리해줘야 한다.
- dartResult의 다음 인덱스가 0이면 score[i]에 10을 넣어준다.
- 10인 경우, dartResult의 index를 ++해줘야한다.
- 보너스 : D, T인 경우 score[i] 값을 꺼내서 제곱, 세제곱해준다.
- 옵션 : 나오지 않을 수 있는 경우이기 때문에, 옵션인지 숫자인지 체크하고 옵션이면 로직을 진행한다.
- *이면, (i가 0보다 큰경우에만 이전 index와) 현재 index를 2배 한다.
- 이전 다트 score에서 옵션이 #이거나 *이어서 중첩인 경우를 문제에는 말해놨는데 해당 풀이 방식에서는 따로 고려할 것은 없다.
- #이면, -1을 곱한다.
- *이면, (i가 0보다 큰경우에만 이전 index와) 현재 index를 2배 한다.
- 마지막에 score 배열들을 모두 합한다.
추가로, 이번 문제는 모든 입출력 예제를 읽으며 이해해본 후에 문제를 푸는게 더 빨리 풀 수 있을 것 같다. (본인은 그러지 않아서 그때그때 조건을 고려하면서 시간이 추가로 걸렸다)
코드
피드백을 받지 않은 코드이기 때문에 완벽한 코드는 아닐 수 있습니다.
public class prg_다트게임 {
public int solution(String dartResult) {
int ans = 0;
int[] score = new int[3]; // 점수 매길 배열
int dartIdx = 0;
// 1. dartResult 하나씩 방문하면서 점수[]에 변환을 준다.
for (int i=0; i< score.length; i++) {
// 2. 숫자
int digit = Integer.parseInt(String.valueOf(dartResult.charAt(dartIdx)));
if (digit == 1 && dartResult.charAt(dartIdx+1) == '0') {
score[i] = 10;
dartIdx++;
}
else score[i] = digit; // 0~9
// 3. 보너스
char bonus = dartResult.charAt(++dartIdx);
if (bonus == 'D') score[i] = pow(score[i], 2);
else if (bonus == 'T') score[i] = pow(score[i], 3);
if (dartIdx >= dartResult.length()-1) break; // 끝난 경우 종료.
// 4. 옵션
char optionOrScore = dartResult.charAt(++dartIdx);
if (!Character.isDigit(optionOrScore)) { // 옵션일 경우
if (optionOrScore == '*') {
score[i] *= 2;
if (i>0) score[i-1] *= 2;
} else { // '#'
score[i] *= (-1);
}
dartIdx++; // index 이동(숫자로)
}
}
// 5. 합
for (int n: score) ans+= n;
return ans;
}
private int pow(int i, int n) {
return (int)Math.pow(i, n);
}
public static void main(String[] args) {
prg_다트게임 t = new prg_다트게임();
int solution = t.solution("1S*2T*3S");
System.out.println(solution);
}
}
피드백과 댓글은 환영입니다.
반응형
'Algorithm & Data Structure > 문제 풀이' 카테고리의 다른 글
[Concept/Algorithm] 이분/이진 탐색 (Binary Search) (0) | 2022.04.17 |
---|---|
[JAVA] 프로그래머스 - 행렬 테두리 회전하기 LV2 (0) | 2022.04.01 |
[JAVA] 프로그래머스 - 전화번호 목록 LV2 (0) | 2022.01.26 |
[JAVA] 프로그래머스 - 완주하지 못한 선수 LV1 (0) | 2022.01.24 |
[프로그래머스] SQL 문제 (0) | 2021.12.13 |