[BAEKJOON] NO.2798 블랙잭

3091 단어 baekjoonCC

지난 학기에는 C언어로만 백준을 풀었었는데
코딩테스트 대비를 위해 이제부터 C++로 풀어보려고 한다!

사실 아직까지 간단한 문제만 풀어서 그런가
C와 크게 다른 점을 느끼지 못하고 있다.

No.2798 "블랙잭"

사실 앞에 몇 번 틀렸다ㅜ

이를 통해 배운 점은!

  1. 역시 예제만 잘 나온다고 다 된 것은 아니다
  2. 뇌피셜을 통해 오류가 날 법한 몇 개의 테스트 케이스를 더 넣어보아야 한다
  3. 제출 전 문제를 한 번 더 꼼꼼히 읽자

내가 틀렸던 이유는
m보다 큰 값은 아무리 m과 가까운 숫자여도 출력되지 않아야 하는데
그 조건을 빠뜨렸었다

그리고 그냥 배운점은!

1. 스케치를 하면 좋다

  • 처음에는 그냥 허공에다가 생각해보려고 했는데 잘 안되서 스케치를 했다.
  • '나라면 세 개의 값을 어떻게 더하면서 m과 가장 가까운 값을 찾을까?' 생각을 해보았다.
    앞에서부터 차례대로 세 장을 뽑아 더하고, 마지막 카드인 세 번째 숫자부터 값을 바꿔보면서
    큰 값을 찾아나갈 것 같다는 결론이 나왔다!
  • 그리고 가장 간단한 테스트케이스를 통해 몇몇 단계를 손으로 써보았다.
    무식한 방법일 수 있지만 삼중반복문을 써서 뽑을 카드의 값을 바꿔주면 되겠다고 생각했다.

2. C++에서 스페이스로 구분하여 입력받는 법은 간단했다

  • cin>>변수1>>변수2 이런 식으로 한 다음,
    스페이스로 구분하여 입력하면 자동으로 변수에 각각 저장된다

3. C++ 배열 동적 할당 복습했다

 int * valOnCard = new int[n];
 delete [] valOnCard;

스케치

  • 교수님께서 간단한 케이스를 통해 한 단계 한 단계 직접 써보는 게 중요하다고 하셨다!
  • 그리고 pseudo-code 를 먼저 작성하라고 하셨다!
    마음 급하다고 바로 코딩부터 하지 말고 계속 기억하면서 문제를 풀어야겠다.

메인 알고리즘
1. 카드들 중 세 개를 뽑아 더할 수 있는 모든 경우의 수를 탐색한다
2. 모든 경우의 수를 탐색하기 위해 삼중 for문을 사용한다

< CODE >

#include <iostream>
#include <cstdlib>
using namespace std;
#define MAX 100

int main()
{
    int n = 0;
    int m = 0;

    cin>>n>>m;

    //int valOnCard[MAX]; 
    int * valOnCard[] = new int[n]; // 동적할당
    for(int i=0; i<n; i++)
    {
        cin>>valOnCard[i];
    }

    int n1, n2, n3;
    int ans = valOnCard[0] + valOnCard[1] + valOnCard[2];
    int tmp;
    
    for(int i=0; i<n-2; i++)
    {
        n1 = valOnCard[i];
        for(int j=i+1; j<n-1; j++)
        {
            n2 = valOnCard[j];
            for(int k=j+1; k<n; k++)
            {
                n3 = valOnCard[k];
                tmp = n1 + n2 + n3;
                if (abs(m - tmp) < abs(m - ans) && tmp <= m)
                {
                    ans = tmp;
                }
            }
        }
    }

    cout<<ans<<endl;
    delete[] valOnCard;

    return 0;
}

좋은 웹페이지 즐겨찾기