일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스케줄링
- 백준
- 타입 객체
- 쓰레드
- 프로그래머스
- DirectX 12
- 운영체제
- 알고리즘
- 렌더링 파이프라인
- 락
- DirectX12
- 병행성 관련 오류
- 컨디션 변수
- 자료구조
- Direct12
- 그리디 알고리즘
- 디자인패턴
- I/O장치
- OS
- codility
- 멀티프로세서
- 영속성
- 파일시스템 구현
- 동적계획법
- 다이나믹 프로그래밍
- 그리디알고리즘
- 멀티쓰레드
- 병행성
- directx
- 다이나믹프로그래밍
Archives
- Today
- Total
기록공간
다트 게임 (프로그래머스) - Java 본문
반응형
해결 방법
뭔가 획기적인 방법이 있지 않을까 계속 생각해봤지만, 그냥 순차적인 방법으로 풀 수 밖에 없는 문제이다.
점수의 합계를 구하는 방법은 다음과 같다.
1. 문자가 나오기 시작할때까지(즉, 숫자를 제외한) 임시 문자열에 담는다.
2. 문자가 나오면 임시 문자열에 담았던 값들을 숫자로 변환한다.
3. 문자가 (S, D, T)이면 변환한 숫자를 알맞게 제곱(1제곱, 2제곱, 3제곱) 해준다.
4. 문자가 (#, *)일 경우
4-1. (*) 일 경우 현재 숫자와 그 이전 숫자를 곱해준다.
4-2. (#) 일 경우 현재 숫자에 -1을 곱해준다.
하지만 이 방법만 사용한다면 이전 숫자를 알 수도 없고 총 점수를 구할 수도 없다. 즉 이 점수들을 기록할 만한 컨테이너가 필요하다.
컨테이너를 배열이든 리스트든 어떤걸 사용해도 되지만 나는 벡터를 사용하였다. 다음 방법이 추가된다.
2. 문자가 나오면 임시 문자열에 담았던 값들을 숫자로 변환한다.
2-1. 변환한 숫자를 벡터 맨 뒤에 add한다. (push back)
...
3. 문자가 (S, D, T)이면 변환한 숫자를 알맞게 제곱(1제곱, 2제곱, 3제곱) 해준다.
3-1. 제곱해준 최종 숫자를 벡터에서 해당 숫자를 넣었던 위치에 갱신해준다.
...
4-1. (*) 일 경우 현재 숫자와 그 이전 숫자를 곱해준다.
=> 벡터에서 해당 숫자를 넣었던 위치 그리고 그 전 위치에 갱신
4-2. (#) 일 경우 현재 숫자에 -1을 곱해준다.
=> 벡터에서 해당 숫자를 넣었던 위치에 갱신
그러면 해당 벡터에는 점수규칙에 맞게 게임별 점수들이 올바르게 담겨있을 것이다. 이제 이 벡터의 값들을 전부 더해주면 총 점수가 나온다.
예제
예를들어 '1D#2S*3S'을 입력받았다 가정해보자. 위 방법을 사용하면 다음과 같다.
※ <> : 다음 기호를 벡터 컨테이너로 가정.
※ idx : 벡터의 마지막 인덱스 위치. 이전 위치에 음수이면 안되기 때문에
인덱스 0 위치에는 더미값으로 0이 담기고, idx는 1부터 시작한다.
'1'
-> 숫자이므로 임시 문자열에 담음
'D'
-> 숫자가 아니므로 임시 문자열을 숫자로 변환하여 벡터에 넣는다.
-> 1의 2제곱으로 1이 담겨진다. <1> (현재 인덱스 : 1)
'#'
-> 현재 숫자에 -1을 곱한다. <-1>
'2'
-> 숫자이므로 임시 문자열에 담음
'S'
-> 숫자가 아니므로 임시 문자열을 숫자로 변환하여 벡터에 넣는다.
-> 2의 1제곱으로 2가 담겨진다. <-1, 2> (현재 인덱스 : 2)
'*'
-> 현재 숫자와 이전 숫자에 2를 곱한다.
-> 현재 인덱스가 2이므로 2와 1 위치 값들에 2를 곱해 갱신한다. <-1*2, 2*2> => <-2, 4>
'3'
-> 숫자이므로 임시 문자열에 담음
'S'
-> 숫자가 아니므로 임시 문자열을 숫자로 변환하여 벡터에 넣는다.
-> 3의 1제곱으로 3이 담겨진다. <-2, 4, 3> (현재 인덱스 : 3)
<-2, 4, 3> 이 담겨졌으므로, 총점은 -2 + 4 + 3 = 5 이다.
코드는 다음과 같다.
import java.util.Vector;
import java.lang.Math;
class Solution {
public int solution(String dartResult) {
int answer = 0;
// 각 게임 점수를 담을 벡터
Vector<Integer> v = new Vector<Integer>();
// 이전 점수 계산 오류 회피를 위한 더미값
v.add(0);
int idx = 0;
String tempStr = "";
for(int i = 0; i < dartResult.length(); i++) {
char tempCh = dartResult.charAt(i);
// 알파뱃이 시작
if(tempCh < '0' || tempCh > '9') {
if(!tempStr.isEmpty()) {
v.add(Integer.parseInt(tempStr));
++idx;
tempStr = "";
}
switch(tempCh) {
case '*':
v.set(idx - 1, v.get(idx - 1) * 2);
v.set(idx, v.get(idx) * 2);
break;
case '#':
v.set(idx, v.get(idx) * -1);
break;
case 'S':
v.set(idx, (int)Math.pow(v.get(idx), 1));
break;
case 'D':
v.set(idx, (int)Math.pow(v.get(idx), 2));
break;
case 'T':
v.set(idx, (int)Math.pow(v.get(idx), 3));
break;
}
} else {
tempStr += tempCh;
}
}
for(int n : v) {
System.out.println(n);
answer += n;
}
return answer;
}
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
점프와 순간 이동 (프로그래머스) - Java (0) | 2020.08.27 |
---|---|
소수 만들기 (프로그래머스) - Java (0) | 2020.08.25 |
N개의 최소공배수 (프로그래머스) - Java (0) | 2020.08.25 |
숫자의 표현 (프로그래머스) - Java (0) | 2020.08.23 |
소수 찾기 (프로그래머스) - Java (0) | 2020.08.22 |
Comments