-
카카오 1차 온라인 코딩테스트 2번 문제(17.09.16)💻 프로그래밍/알고리즘 2017. 10. 5. 00:34
안녕하세요~! 코딩하는 '잡'개발자 JAY 입니다!! :D
오늘은 카카오1차 온라인 코딩테스트 2번 문제를 풀이해보도록 하겠습니다.
문제 및 풀이 링크 : http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
2. 다트 게임(난이도: 하)
2번 문제는 다트게임 입니다. 문제풀다가 갑자기 아이유가 나와서 당황했네요 ㅋㅋㅋ(깨알 카카오 게임 홍보)
문제를 간단히 요약하자면 3번 다트를 던졌을때 나오는 점수의 합을 구하는 것입니다.
다트점수는 1~10, Single(
S
), Double(D
), Triple(T
)(점수^1 , 점수^2 , 점수^3 ), 스타상/아차상(해당 점수 및 바로전 점수 두배/ 해당 점수 -화) 이렇게 구성되어 있는 채점방식을 통해 점수가 구해집니다.그래서 입력형식은 "1S2D*3T" 이렇게 string으로 입력되어 집니다.
카카오 해설: 문자열 처리String Manipulation를 묻는 문제입니다. 앞에서부터 한 글자씩 잘라서 처리할 수 있고, 또는 간단한 컴파일러를 만들듯이 토큰화Tokenizing와 의미 분석Semantic Analysis을 통해 어렵지 않게 계산할 수 있습니다.
네.. 이렇다고 합니다. 근데 정말 어렵지 않게 문제를 풀 수 있으며, 문자열을 하나씩 체크하여 계산 방식만 맞게 처리해주면 문제는 그리 어렵지 않게 풀립니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <iostream>#include <string>#include <math.h>using namespace std;int solution(string dartResult);int main(void){cout << "answer : " << solution("1S2D*3T") << endl;cout << "answer : " << solution("1D2S#10S") << endl;cout << "answer : " << solution("1D2S0T") << endl;cout << "answer : " << solution("1S*2T*3S") << endl;cout << "answer : " << solution("1D#2S*3S") << endl;cout << "answer : " << solution("1T2D3D#") << endl;cout << "answer : " << solution("1D2S3T*") << endl;return 0;}int solution(string dartResult){int answer = 0;unsigned int strLength = 0; // 문자열 길이int unitDigit = 0; // 1일때 한번더 숫자를 체크하면 10의자리int dartPoint[3] = {0, 0, 0}; // 다트점수int pointPosition = -1; // 다트 순서strLength = dartResult.length();// 문자열 길이만큼 for문을 돌려 점수 합산int tempPoint = 0;for(int j = 0; j < strLength; j ++) {if(dartResult[j] >= '0' && dartResult[j] <= '9') { // 숫자(점수) 체크if(unitDigit == 1) { // 10일 경우tempPoint *= 10;} else {tempPoint = 0;tempPoint = dartResult[j] - '0'; // aToipointPosition += 1;unitDigit = 1;}} else if(dartResult[j] == 'S' || dartResult[j] == 'D' || dartResult[j] == 'T') { // 보너스 체크if(dartResult[j] == 'S') tempPoint = (int)pow(tempPoint, 1);else if(dartResult[j] == 'D') tempPoint = (int)pow(tempPoint, 2);else if(dartResult[j] == 'T') tempPoint = (int)pow(tempPoint, 3);dartPoint[pointPosition] = tempPoint;unitDigit = 0;} else {if(dartResult[j] == '*') { // 스타상 : 해당점수와 바로 전 점수 두배if(pointPosition > 0) dartPoint[pointPosition - 1] *= 2;dartPoint[pointPosition] = tempPoint * 2;} else if(dartResult[j] == '#') { // 해당점수 -화dartPoint[pointPosition] = tempPoint * -1;}}}answer = dartPoint[0] + dartPoint[1] + dartPoint[2];return answer;}소스코드를 보시면 문자열의 길이만큼 for문을 돌려 입력된 문자열의 원소를 하나하나 체크하여 계산하는 것을 볼 수 있습니다. S, D, T 계산의 경우 math.h의 pow함수를 사용하여 계산하였습니다.
그리고 문자열에서 -'0' 하여 계산해준 이유는 예를들어 '1'의 경우 아스키코드 값이므로 int형으로 보면 49입니다. '0'은 48이겠죠? 그렇기 때문에 '1'(49) - '0'(48) 해주면 int형으로 1이라는 숫자를 얻게 됩니다. 즉 Ascii to Int라고 보시면 됩니다. 쉬운 내용이지만 모르시는 분들도 있을 것 같아서 말씀드려요~
아스키 코드 관련 설명 : https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C
문제 2번의 경우 문자열과 문자열을 처리하는 방법만 알고 있으면 간단히 풀 수 있는 문제였습니다.
이상으로 카카오 1차 온라인 코딩테스트 2번문제 풀이였습니다.
즐거운 코딩하세요~! JAY 였습니다!!
'💻 프로그래밍 > 알고리즘' 카테고리의 다른 글
카카오 1차 온라인 코딩테스트 5번 문제(17.09.16) (0) 2017.10.15 카카오 1차 온라인 코딩테스트 4번 문제(17.09.16) (4) 2017.10.08 카카오 1차 온라인 코딩테스트 3번 문제(17.09.16) (0) 2017.10.07 카카오 1차 온라인 코딩테스트 1번 문제(17.09.16) (0) 2017.10.03 카카오 1차 온라인 코딩테스트 후기(17.09.16) (0) 2017.10.03