일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝
- Machine learning
- p-value
- Journal Review
- 알고리즘
- 그리디
- Deeplearning
- AA test
- 정렬
- 중앙갑
- 7569번
- Game Data Analysis
- 스택
- 통계
- 백준
- 자료구조
- BFS
- 구현
- Anti Cheat
- Stack
- 큐
- cs231n
- Python
- anomaly detection
- ML
- datascience
- c++
- classification
- Queue
- DP
- Today
- Total
Software Hyena::
[백준 11916번] -볼질 / C++ (Class로 구현해보기) 본문
www.acmicpc.net/problem/11916
11916번: 볼질
5월 5일 ‘방긋 스마일스’와의 어린이날 프로야구 경기에서 ‘GA 아인타즈’의 감독 성균이는 테스트 겸으로 창석이를 선발 투수로 등판시켰다. 그러나 창석이는 스트라이크를 못 던지는 치명
www.acmicpc.net
문제
5월 5일 ‘방긋 스마일스’와의 어린이날 프로야구 경기에서 ‘GA 아인타즈’의 감독 성균이는 테스트 겸으로 창석이를 선발 투수로 등판시켰다. 그러나 창석이는 스트라이크를 못 던지는 치명적인 단점이 있다. 그는 경기 때 '볼', '몸에 맞는 공', '폭투' 이렇게 3가지 종류의 공을 던진다. 창석이가 너무나도 터무니없는 공을 던지기 때문에 타자가 배트를 휘두를 일은 없다.
한 타자를 상대로 '볼'을 4번 던지거나 '몸에 맞는 공'을 던질 경우, 타자는 1루로 간다. 기존 주자는 아래 조건에 의하여 이동한다.
- 1루 주자는 무조건 2루로 간다.
- 2루 주자는 1루에 주자가 있는 경우에만 한해서 3루로 간다.
- 3루 주자는 1, 2루에 주자가 있는 경우에만 한해서 홈으로 간다. 이때 3루 주자는 1득점을 한다.
한편, '폭투'를 던지면 주자는 아래 조건에 의하여 이동한다.
- 1, 2루에 있던 주자는 각각 2, 3루로 간다.
- 3루 주자는 홈으로 들어오면서 1득점을 한다.
'폭투'도 '볼'의 한 종류이므로, '볼'-'폭투'-'볼'-'볼'도 4개의 '볼'로 인정이 되며, 4번째 '볼'이 폭투라면 타자도 1루로 간다.
창석이는 1회 초에 N개의 공을 던지고 다른 투수로 교체되었다. 창석이가 던진 공의 종류가 주어질 때 창석이의 총 실점을 구하는 프로그램을 작성하여라. 단, 한 타자를 상대하는 도중에 창석이가 다른 투수로 교체될 수도 있음에 유의하여라.
입력
첫 번째 줄에는 창석이가 강판당할 때까지 던진 공의 수 N이 주어진다. (1 ≤ N ≤ 50,000)
두 번째 줄에는 창석이가 던진 공의 종류가 주어진다. '볼', '몸에 맞는 공', '폭투'는 각각 1, 2, 3으로 주어진다.
출력
창석이의 총 실점을 출력한다.
--------------------------------------------------------------------------------------------------------
풀이
<C++>
#include <iostream>
using namespace std;
class Baseball {
public:
bool base1 = false;
bool base2 = false;
bool base3 = false;
int score = 0;
int ballcount = 0;
void oneCount(int number) {
if (number == 1) { // 볼인경우
if (ballcount == 3) {
if (base1 == false) {
this->base1 = true;
this->ballcount = 0;
}
else if (base2 == false) {
this->base2 = true;
this->ballcount = 0;
}
else if (base3 == false) {
this->base3 = true;
this->ballcount = 0;
}
else {
this->ballcount = 0;
this->score += 1;
}
}
else {
this->ballcount += 1;
}
}
else if (number == 2) { // 몸에 맞는 공인 경우
if (base1 == false) {
this->base1 = true;
this->ballcount = 0;
}
else if (base2 == false) {
this->base2 = true;
this->ballcount = 0;
}
else if (base3 == false) {
this->base3 = true;
this->ballcount = 0;
}
else {
this->ballcount = 0;
this->score += 1;
}
}
else if (number == 3) { // 폭투인 경우
if (ballcount == 3) { // 폭투와 볼넷이 겹칠때
if (base3 == true) {
base3 = false;
this->score += 1;
}
if (base2 == true) {
base2 = false;
this->base3 = true;
}
if (base1 == true) {
base1 = false;
this->base2 = true;
}
this->ballcount = 0;
this->base1 = true;
}
else {
if (base3 == true) {
base3 = false;
this->score += 1;
}
if (base2 == true) {
base2= false;
this->base3 = true;
}
if (base1 == true) {
base1 = false;
this->base2 = true;
}
this->ballcount += 1;
}
}
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
int num;
Baseball baseball;
for (int i = 0; i < N; ++i) {
cin >> num;
baseball.oneCount(num);
}
cout << baseball.score;
return 0;
}
이번 문제는 그냥 굳이 Class로 풀어보고 싶어서, Class를 구현해서 풀어보았다.
main 함수는 간단하다. 정수 N을 입력받고, num을 받으면서 baseball Class의 oneCount method에 반복하며 집어넣는다. 반복이 모두 끝나면, baseball의 score 맴버 변수를 출력한다.
Class를 살펴보면 1루, 2루, 3루에 대한 정보, score, 현재 ballcount가 맴버변수이고, method는 oneCount 하나만 구현하였다. 1,2,3인경우로 나누어서 볼인경우, 몸에 맞는 공인경우, 폭투인경우마다 다르게 base에 대한 정보를 업데이트 해주었다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2841번] - 외계인의 기타 연주 / C++ (0) | 2021.03.08 |
---|---|
[백준 3986번] - 좋은 단어 / C++ (stack) (0) | 2021.03.05 |
[백준 11292번] - 키 큰 사람 / C++ (0) | 2021.02.25 |
[백준 1422번] - 숫자의 신 / C++ (0) | 2021.02.24 |
[백준 11651번] - 좌표 정렬하기 2 / C++ (0) | 2021.02.24 |