https://www.acmicpc.net/problem/17215
소감
동아리의 개발팀장(에리카 출신) 이 풀라고 준 문제.
어떤 알고리즘을 요구하는지는 잘 모르겠고 일종의 점수 계산기를 만드면 되는 문제이다.
간단해보이지만 내 코드의 잘못된 부분을 찾아 고치는 것이 조금 번거로웠다.
그렇게 깔끔하지도 않은 정답이라는 생각. 정답맞춘 분들 리스트를 보면 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(12, vector<int>(4, 0));
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 |
'프로그래밍 > programmers&bj' 카테고리의 다른 글
[C++][알고리즘] 백준 1813번 마지막한마디 (0) | 2019.09.01 |
---|---|
[C++][알고리즘] 백준 2346번 풍선터트리기 (0) | 2019.09.01 |
[C++][알고리즘] 프로그래머스::타깃넘버 (0) | 2019.08.24 |
[C++][알고리즘] 프로그래머스::전화 번호 목록 (0) | 2019.08.20 |
[C++][알고리즘] 프로그래머스::체육복 풀이 (0) | 2019.08.20 |