만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[C++][알고리즘] 백준 14215번 볼링점수계산

D36choi 2019. 8. 28. 16:51
728x90

https://www.acmicpc.net/problem/17215

 

17215번: 볼링 점수 계산

첫째 줄에 각 기회마다 소현이가 쓰러뜨린 볼링핀의 개수가 공백없이 주어진다. 이때 스트라이크는 S, 스페어는 P, 핀을 하나도 못 쓰러뜨린 것은 -으로 주어진다.

www.acmicpc.net

 

소감

동아리의 개발팀장(에리카 출신) 이 풀라고 준 문제.

어떤 알고리즘을 요구하는지는 잘 모르겠고 일종의 점수 계산기를 만드면 되는 문제이다.

 

간단해보이지만 내 코드의 잘못된 부분을 찾아 고치는 것이 조금 번거로웠다.

그렇게 깔끔하지도 않은 정답이라는 생각. 정답맞춘 분들 리스트를 보면 900,800Byte로도 맞추시던데... 갠적으로 존경...

(참고로 본인은 1700B 정도 ^.^;;)

고민해볼법한 부분들

굳이 vector 2차원배열을 사용했어야했나? 

뭔가 vector 멤버함수들을 써먹어야할거라고 생각했지만... 결국엔 단순히 참조연산자를 이용한 값 참조밖에 필요가 없어서 단순 2차원배열을 사용했어도 괜찮았을듯. 물론 그게 더 효율적일거라는 보장은 없다.

기억해야할 뽀인트들

1. atoi (const char *string)

'문자'를 INTEGER 상수로 변환해주는 함수. 

 

2. string.substr(int offset,int 범위).c_str()

문자열의 부분문자열을 offset 위치부터 범위만큼(1~) 문자열로 추출하고 c_str()를 통해 그 부분문자열의 시작주소를 반환한다. atoi 함수의 파라미터는 포인터가 요구되기때문에 위치를 전달해주어야해서 c_str()을 이용.

 

3.getline(cin, string input)

string type 변수를 input으로 받고자 할때 cin >> string 하면 안되고 getline을 통해 받아야 한다. 첫번째 파라미터는 이용할 input 명령어. 기본적으로 std::cin 을 사용한다.

 

 

마이 코드

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int cal(string input) {
    char c;
    int index = 0;
    int score = 0;
    int i = 0// 실행
    vector< vector<int> > board(12vector<int>(40));
    int tries = 0;
 
    for (i = 0; i < input.size(); i++) { // 0 : 1차 시도 점수 / 1 : 2차 시도 점수 / 2: 프레임 쓰러트린 핀수 / 3: 상태SP
        if (input.at(i) == 'S') {
            board[index][0= 10;
            board[index][1= 0;
            board[index][2= 10;
            board[index][3= 1;
            index++;
            tries = 0;
 
        }
        else if (input.at(i) == 'P') {
 
            board[index][1= 10 - board[index][0];
            board[index][2= 10;
            board[index][3= 2;
            index++;
            tries = 0;
        }
        else if (input.at(i) == '-') {
            if (tries == 0) {
                board[index][0= 0;
                board[index][3= 0;
                tries++;
            }
            else {
                board[index][1= 0;
                board[index][2= board[index][0];
                board[index][3= 0;
                tries = 0;
                index++;
            }
        }
        else {
            if (tries == 0) {
                board[index][0= atoi(input.substr(i, 1).c_str());
                tries++;
            }
            else if (tries == 1) {
                board[index][1= atoi(input.substr(i, 1).c_str());
                board[index][2= board[index][0+ board[index][1];
                board[index][3= 0;
                tries = 0;
                index++;
            }
        }
    }
    for (index = 0; index < 10; index++) {
        score += board[index][2];
 
        if (board[index][3== 1) { // strike
            if (board[index + 1][3== 1) {
                score += board[index + 1][0+ board[index + 2][0];
            }
            else {
                score += board[index + 1][0+ board[index + 1][1];
            }
        }
        else if (board[index][3== 2) {
            score += board[index + 1][0];
        }
    }
    return score;
}
 
int main() {
    string input;
    getline(cin, input);
    cout << cal(input);
 
}
cs