일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- LinkdeList
- DivideandConquer
- 너비우선탐색
- 정렬
- SAP CERTIFICATION
- 백준
- Altorithm
- CJ올리브네트웍스
- binarysearch
- 자료구조
- kakaoblind
- 최종합격후기
- DynamicProgramminng
- ABAP NetWeaver 7.50
- 분할정복
- Baekjoon
- codingTest
- insertion
- 이분탐색
- Algorithm
- 프로그래머스
- 알고리즘
- ABAP CERTIFICATION
- sap abap
- 동적계획벅
- kakao
- programmers
- SAP CERTI
- datastructure
- sort
- Today
- Total
서랑의 개발 블로그
[프로그래머스/C++] [1차] 다트 게임 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/17682
코딩테스트 연습 - [1차] 다트 게임
programmers.co.kr
풀이
점수를 어떻게 저장해 놓을지 고민하다 점수는 숫자와 SDT에 의해만 결정이 되고 *, #의 의해서는 원래 점수에 추가적으로 부여되는 것이므로 크기가 3인 배열로 저장해 놓았다.
int score[3]; // 점수를 저장할 배열
int n = 0; // index값
char c = ' '; // 옵션(*,#)을 저장할 변수
변수는 이렇게 선언을 하고 바로 for 문으로 dartResult를 하나씩 다 돌아주었다. 숫자 다음은 무조건 SDT중에 하나 이기 때문에 조건문은 옵션(*,#)과 숫자 일 경우로 나눠주었다.
if(dartResult[i] == '*'){
if(n != 0) score[n-1] = score[n-1] * 2;
score[n] = score[n] * 2;
c = '*';
n++;
}
else if(dartResult[i] == '#'){
score[n] = -score[n] ;
c = '#';
n++;
}
일단 옵션일 경우를 먼저 보자면 현재 옵션이 *일 경우 첫 번째 시도일 경우 즉 n이 0일 경우만 빼고는 앞에 점수도 2배로 해 줘야 하므로 조건문을 if(n != 0)을 넣어 앞에 점수도 2배로 해 주었다. 그리고 c변수에 옵션을 저장해 놓고 이제 이번 순서의 점수는 끝났으므로 n값을 증가시켜 주었다. #일 경우에는 그냥 자기 자신만 -1배 주면 되기 때문에 score[n]값을 -1해 주고 c와 n값을 바꿔주었다.
이렇게 코드를 짜면 옵션들이 중첩되었을 때도 알아서 계산이 된다.
else{
int num = i+1; // SDT확인을 위한 index
score[n] = dartResult[i] - 48; // 현재 점수 저장
if(dartResult[num] == '0'){ // 점수가 1 ~ 10까지 가능하므로 10경우 처리
num++;
score[n] = 10;
i++;
}
if(dartResult[num] == 'D') score[n] *= score[n];
else if(dartResult[num] == 'T') score[n] *= score[n] * score[n];
if(num+1 < dartResult.size() && dartResult[num+1] > 47 && dartResult[num+1] < 58) { //옵션이 없을 경우 처리
c = ' ';
n++;
}
i++;
}
그 다음 숫자 일 경우를 보면 숫자 다음은 SDT 중 하나가 오므로 num에 i+1 값을 넣어주었다. 무조건 i+1이 SDT 중 하나이나 점수 10일 경우인 예외상황이 있다. 이 경우는 SDT가 i+2이므로 num값을 증가시켜주고 score[n]에 10을 넣어준다. 그다음 i++를 해 준 이유는 10은 두 자릿수 이기 때문에 한자리 수 일 때보다 한 번 더 증가시켜줘야 하므로 i++을 해 주었다.
그다음은 SDT를 처리하는 코드를 구현해주었다. S일 때는 1 배수이므로 따로 해줄 필요가 없으므로 안 써주었고, D와 T일 경우에만 처리를 해 주었다. 그다음은 옵션이 없을 경우도 있으므로 옵션이 없는 경우 처리를 해 주었다.
return score[0] + score[1] + score[2];
마지막으로 값을 다 더해서 return해 주었다.
전체 코드
#include <string>
using namespace std;
int solution(string dartResult) {
int score[3];
int n = 0;
char c = ' ';
for(int i = 0; i < dartResult.size(); i++){
if(dartResult[i] == '*'){
if(n != 0) score[n-1] = score[n-1] * 2;
score[n] = score[n] * 2;
c = '*';
n++;
}
else if(dartResult[i] == '#'){
score[n] = -score[n] ;
c = '#';
n++;
}
else{
int num = i+1;
score[n] = dartResult[i] - 48;
if(dartResult[num] == '0'){
num++;
score[n] = 10;
i++;
}
if(dartResult[num] == 'D') score[n] *= score[n];
else if(dartResult[num] == 'T') score[n] *= score[n] * score[n];
if(num+1 < dartResult.size() && dartResult[num+1] > 47 && dartResult[num+1] < 58) {
c = ' ';
n++;
}
i++;
}
}
return score[0] + score[1] + score[2];
}
'코테 대비 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] [1차] 캐시 (0) | 2021.08.14 |
---|---|
[프로그래머스/C++] 입국심사 (0) | 2021.08.13 |