알고리즘

    [class2] (백준 2798) 블랙잭

    문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다. N장의 카드에 써져 있는 숫자가 주어졌을 때, ..

    [class2] (백준 2775) 부녀회장이 될테야

    문제 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다. 이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다. 아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다. 입력 첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 ..

    [class2] (백준 2292) 벌집

    문제 위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다. 입력 첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다. 출력 입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다. 제한 예제 입력 1 복사 13 예제 출력 1 복사 3 힌트 출처 ICPC > Regionals > Asia Pacific > Korea ..

    [class2] (백준 2231) 분해합

    #include #include int main() { int input,place; int n = 1; int result = -1; scanf("%d",&input); place = 1000000; while(1) { if(input/place != 0) break; place/=10; } while(1) { if(place/10==0) break; place/=10; n++; } int checknum; int temp; for(int i = input - 9*n;i0;j--) { temp=i/pow(10,j-1); checknum+=temp%10; } if(checknum==input) { result=i; break; } } if(result==-1) printf("0\n"); else prin..

    [class2] (백준 10250) ACM 호텔

    #include int main() { int testnum; int w,h,n; int temp; scanf("%d",&testnum); while(testnum-- > 0) { scanf("%d %d %d",&h,&w,&n); temp = n%h==0 ? h:n%h; printf("%d\n",temp*100+((n-1)/h+1)); } return 0; }

    [class2] (백준 4153) 직각삼각형

    #include int main() { int len[3]; int temp; while(1) { scanf("%d %d %d",&len[0],&len[1],&len[2]); if(len[0]==0&&len[1]==0&&len[2]==0) break; for(int i = 0;i