◯문제 링크◯
[백준,2798]블랙잭
◯코드 미리보기◯
#include <iostream>
#include <vector>
using namespace std;
int main() {
int howManyCard_N, baseNum_M, numInput, plusResult, largest=0;
vector<int> cardList;
vector<int> plusList;
cin >> howManyCard_N >> baseNum_M;
for (int i = 0; i < howManyCard_N ; ++i) {//++i를 쓰면 속도가 더 빠르다고 한다.
cin >> numInput;
cardList.push_back(numInput);
}
for (int a = 0; a < howManyCard_N; a++) {
for (int b = a + 1; b < howManyCard_N; b++) {
for (int c = b + 1; c < howManyCard_N; c++) {
plusList.push_back(cardList[a] + cardList[b] + cardList[c]);
}
}
}
for (auto plusResult : plusList) { //for문의 범위를 배열의 값에 기반해서 돌리는 기능
if (plusResult <= baseNum_M) {
if (largest < plusResult) {
largest = plusResult;
}
}
}
cout << largest;
return 0;
}
◯설명◯
#include <iostream>
#include <vector>
using namespace std;
int main() {
int howManyCard_N, baseNum_M, numInput, plusResult, largest=0;
vector<int> cardList;
vector<int> plusList;
코드 초반부.
iostream과 vector는 헤더파일의 이름이다.
iostream은 표준 라이브러리 디렉토리, vector는 vector클래스를 사용하기 위한 헤더파일이다.
vector : 시퀀스 컨테이너(데이터를 선형으로 저장하는 컨테이너)의 일종. 리스트와는 달리 새로운 요소가 추가될 때마다 뒷부분에 추가해서 길이가 늘어난다.
main함수 아래에는 이번 코드에서 사용된 변수들이 선언되어 있다.
눈여겨 볼 것은 cardList와 plusList이다. 이 둘은 위에서 언급한 vector의 형태로 선언되어 있다. 여기서 알 수 있는 것은 'vector<원하는 데이터 타입> 원하는 이름'의 형태로 선언을 한다는 것을 알 수 있다.
cin >> howManyCard_N >> baseNum_M;
for (int i = 0; i < howManyCard_N ; ++i) {//++i를 쓰면 속도가 더 빠르다고 한다.
cin >> numInput;
cardList.push_back(numInput);
}
문제에서 제시된 값들을 받아주는 코드이다.
먼저 첫줄엔 2개의 변수를 받는다. c언어에선 map함수를 이용했던 것 과는 달리 c++에선 단순히 화살표(>>)를 추가해 줌으로써 두개의 변수를 한 줄에 받을 수 있다.
for문에서는 두번째 줄에 입력되는 변수를 받는다. for문의 범위를 howManyCard_N만큼 설정해서 루프를 돌리고, 안에서는 숫자를 입력받고 push_back함수를 이용해서 입력받은 numInput변수를 cardList안에 저장한다. (vector클래스.push_back(저장하고싶은 변수)의 형태로 사용)
for (int a = 0; a < howManyCard_N; a++) {
for (int b = a + 1; b < howManyCard_N; b++) {
for (int c = b + 1; c < howManyCard_N; c++) {
plusList.push_back(cardList[a] + cardList[b] + cardList[c]);
}
}
}
다음으로 나오는 for문은 카드의 모든 합을 계산하는 for문이다.
처음 for문에서는 카드의 갯수만큼 반복을 돌린다. 두번째는 첫번째 for문의 증가하는 변수 a에 1을 더한 값부터 시작해서 똑같이 가트의 갯수까지만 반복을 돌린다. 세번째도 두번째의 증가하는 변수 b에 1을 더한 값부터 시작한다. 그리고 각각의 숫자를 vector의 위치로 받아서(vector도 배열이기 때문에 list와 똑같은 방식으로 위치를 선택할 수 있다.) 모든 값을 더한다. 그 다음 plusList에 바로 저장해준다.(plusList는 vector이다)
for (auto plusResult : plusList) { //for문의 범위를 배열의 값에 기반해서 돌리는 기능
if (plusResult <= baseNum_M) {
if (largest < plusResult) {
largest = plusResult;
}
}
}
cout << largest;
return 0;
}
그 다음 해야될 것은 근접한 최대값을 찾는 것이다. 두가지 포인트로 나눠서 생각할 수 있는데, 딜러가 외친 숫자보다 작은지 확인 하는 것이랑, 그 중에서 최대값을 찾는 것이다.
먼저 딜러가 외친 숫자보다 작거나 같은 값을 찾기 위해서 if문을 사용했다. 그 다음, 그 중에서 최대값을 찾기 위해서 다시 한번 if문을 사용한다. 만약 조건에 해당하게 되면 largest에 값을 저장하게 된다. largest는 선언할 때 0이라는 값을 할당했기 때문에 처음 들어온숫자는 무조건 저장되게 된다.
이러한 과정들은 모두 for문안에서 작동한다. for문을 눈여겨 봐야 하는데, 이런 형식으로 사용하면 배열의 크기만큼만 반복을 실행하게 된다. plusResult는 배열의 값을 가지게 되는 변수로, 원하는 변수를 넣으면 된다. plusList는 내가 반복 시키고 싶은 배열이 들어오는 자리이다.
그 다음 결과를 출력해준 뒤 함수를 종료한다.
◯배운 것◯
⩥vector클래스 : 시퀀스 컨테이너의 일종. 새로운 값을 추가할 때 특정 요소를 지정하는 것이 아니라 vector의 뒷부분에 새로운 요소를 추가하는 방식으로 길이를 늘릴 수 있음.
사용하려면 vector파일을 include해야한다.
⩥for 범위 반복
시작과 끝을 지정하지 않고 처음부터 끝가지 순회를 하는 반복문
for(데이터타입 변수이름 : 데이터리스트)의 형태로 사용한다. 이 때, 데이터 리스트는 선형 구조여야 한다.
주의할 점은 기존의 for문과는 달리 i를 이용해서 조절하지 않고 데이터 리스트속의 값만을 가지고 동작한다는 것이다.
⩥auto키워드 : 사용하는 초깃값의 형식에 맞춰 선언하는 변수의 형식이ㄹ 자동으로 결정된다.