반응형
programmers.co.kr/learn/courses/30/lessons/17682
구현 방법
처음에 들었던 생각은, 주어진 문자열을 문자열 길이만큼 반복하면서, 숫자를 찾으면 그다음을 읽어와 S, D, T 중 판별하고, 그다음을 읽어와 *이나 #이 있는지 체크해서 점수를 추가해주는 방법을 생각했습니다.
하지만 이 방법은 10처럼 두 자리의 숫자가 오면 틀린 로직이었습니다.
이 문제의 가장 까다로운 상황은 2자리의 정수가 점수로 기록되었을 때인 것 같습니다.
새로 생각한 로직은, 문자열을 읽을 때, 숫자가 아닌 문자가 나올 때까지의 숫자를 하나의 temp변수에 담아줍니다.
예를 들어 "100S"라는 문자열이 오면 처음부터 탐색해 "100"이라는 문자열을 temp에 담아줍니다.
그 후, temp가 비어있지 않으면 stoi함수를 사용해 문자열을 정수로 변환해 주었고, currentNum이라고 명명했습니다.
숫자 다음에 나온 문자가 S, D, T,*,#중 어느 것인지 판별해 점수를 계산해주었습니다.
S, D, T면 pow() 함수를 사용해 알맞은 계산 값을 sums라는 배열에 넣어주었습니다.
*,#면 sums배열을 참조해 이전에 넣어준 값들을 계산해주었습니다.
위 로직은 아래와 같이 소스코드로 작성하였습니다.
소스코드
#include <bits/stdc++.h>
using namespace std;
int solution(string dartResult) {
int answer = 0;
vector<int> sums;
string temp;
//전체 문자열 탐색
for(int i =0 ;i<dartResult.size();i++) {
//S,D,T,*,#이 아닐 때 , 즉 숫자인 경우
if(dartResult[i] != 'S' && dartResult[i] != 'D' && dartResult[i] != 'T' && dartResult[i] != '*' && dartResult[i] != '#') {
//2자리 정수 올때 temp라는 문자열에 "10"이라고 저장
temp += dartResult[i];
} else {
int currentNum= 0;
//temp문자열이 비어있지않으면 정수로 변경
if(!temp.empty())
currentNum= stoi(temp);
int result =0;
if(dartResult[i] == 'S') {
result = pow(currentNum,1);
sums.push_back(result);
temp ="";
} else if(dartResult[i] == 'D') {
result = pow(currentNum,2);
sums.push_back(result);
temp ="";
} else if(dartResult[i] == 'T') {
result = pow(currentNum,3);
sums.push_back(result);
temp ="";
} else if(dartResult[i] == '*') {
if(sums.size()>1) {
sums[sums.size()-1] *= 2;
sums[sums.size()-2] *= 2;
} else {
sums[sums.size()-1] *= 2;
}
} else if(dartResult[i] == '#') {
sums[sums.size()-1] *= -1;
}
}
}
for(int i=0;i<sums.size();i++) {
answer += sums[i];
}
return answer;
}
반응형
'코딩테스트 > 프로그래머스(lv1)' 카테고리의 다른 글
[프로그래머스 Level 1] 신규 아이디 추천 (C++) (0) | 2021.01.31 |
---|---|
[프로그래머스 Level 1] 직사각형 별찍기 (C++ - 2가지) (0) | 2021.01.30 |
[프로그래머스 Level 1] 비밀 지도 (C++) (0) | 2021.01.30 |
[프로그래머스 Level 1] 실패율 (C++) (0) | 2021.01.30 |
[프로그래머스 Level 1] 체육복 (C++) (2) | 2021.01.24 |
댓글