스터디 - 씨앗
공지 커리큘럼
5월 1주차 알고리즘

차의 높이가 168 인 경우 세 지하차도의 높이가 주어질 때 지하차도에 충돌하지 않고 건널수 있는지 ( NO CRASH ) 아니면 지하차도에 부딪히는지 ( CRASH X )를 알아내는 프로그램을 작성하는 것이 문제이다.
입력
지하차도의 높이가 입력으로 주어진다. 각 지하차도의 높이는 0 에서 300 이다.
출력
세 개의 지하차도를 무사히 빠져 나가면 "NO CRASH" 를 출력하고 아니면 "CRASH X" 를 출력한다.
즉 지하차도의 높이는 168 이하이면 부딪히고 , X 는 최초로 부딪히는 지하차도의 높이이다.
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a<168) printf("CRASH %d",a);
else if(b<168) printf("CRASH %d",b);
else if(c<168) printf("CRASH %d",c);
else printf("NO CRASH");
return 0;
}
4월 3주차 알고리즘
책상 위 1 번 박스가 N 개 놓여있다.( N 은 2 이상 )
책상 아래에는 2 번 박스 , 3 번 박스,...가 무한 개 있다.
1 번 박스가 가장 크고 , 다음은 2 번 박스 , 3 번 박스 ...
2 번 박스를 1 번 박스에 넣을 수 는 있지만 3 번 박스를 1 번 박스에 넣을 수는 없다. 즉 i 번 박스에는 i+1 번 박스 만을 넣을 수 있다.
다음 과정을 T 번 반복한다.
- 몇 개의 1 번 상자마다 2 번 상자 K 개를 집어 넣는다.
- 몇 개의 2 번 상자마다 3 번 상자 K 개를 집어 넣는다.
- 몇 개의 3 번 상자마다 4 번 상자 K 개를 집어 넣는다.
- ...
어떤 상자 안에 아무 것도 없으면 이 상자는 비어 있다고 한다. T번 과정을 반복 한 후 책상 위에는 F 개의 빈 상자가 있다.
다음 그림은 N = 2 , K = 2 , T = 2, F = 5 인 경우의 예이다.

문제는 정수 N, K, T, F 가 주어질 때 책상 위에 있는 총 상자 개수를 구하는 것이다.
입력
첫 줄에 네 개의 정수가 주어진다: N, K, T, F (1 < N , K , T, F < 1 000 000 이고 N < F)출력
총 상자 개수를 출력한다.int main()
{
int n,k,t,f;
scanf("%d%d%d%d",&n,&k,&t,&f);
printf("%d",(f-n)/(k-1)+f);
return 0;
}
4월 2주차 알고리즘

일련의 개미떼들이 길이가 L cm 인 수평 작대기를 걸어간다. 이 들은 각 초당 1 cm 의 속도로 걸어가고 있다.
개미떼들이 작대기의 끝지점에 도달 하면 그 들은 이 작대기에서 자유 낙하한다. 두 마리의 개미가 서로 만난다면 그들은 가는 방향을 바꾸어 반대 방향으로 걸어간다. 개미가 현재 있는 작대기의 위치를 알지만 우리는 개미가 걷는 방향을 알지는 못한다.
우리가 할 일은 모든 개미들이 작대기에서 자유낙하 할수 있는 최대 빠른 시간과 느린 시간을 구하는 것이다.
입력
첫 줄에는 두 개의 정수가 입력으로 주어진다. 첫 수는 작대기의 길이 이고 다른 하나는 개미의 수 n 이다. 다음 n 개의 수는 개미가 현재 위치하고 있는 위치이다.입력의 모든 수는 1000000 이하의 정수이다.
출력
두 수를 출력한다. 첫 수는 제일 빠른 시간 , 가장 느린 시간이다.#include <stdlib.h>
int main()
{
int a,b;
int tmp=0;
int cnt=0;
scanf("%d%d",&a,&b);
if(b<=1){
scanf("%d",&tmp);
if(tmp >= a/2) printf("%d %d",a-tmp,tmp);
else printf("%d %d", tmp,a-tmp);
}
else{
int tmp2=0;
int tmp3=0;
do{
scanf("%d",&tmp);
if(cnt==0) {
tmp2=tmp;
tmp3=tmp;
}
else{
if(abs(a/2-tmp) >= abs(a/2-tmp2)){
tmp2=tmp;
}
if(abs(a/2-tmp) <= abs(a/2-tmp3)){
tmp3=tmp;
}
}
cnt++;
}while(cnt<b);
if(tmp3 >= a/2) printf("%d ", a-tmp3);
else printf("%d ", tmp3);
if(tmp2 > a/2) {
if(a%2==0)
printf("%d",abs(a/2-tmp2)*2+(a-tmp2));
else
printf("%d",abs(a/2-tmp2)*2+(a-tmp2)-1);
}
else printf("%d",abs(a/2-tmp2)*2+tmp2);
}
return 0;
}
5월 3주차 씨앗
카메롯 성에서는 회의가 열리고 있다. 밤마다 용이 나타나서 백성들을 괴롭히기 때문 이다.
원탁의 기사 모두가 용과 싸우고 싶어 하지만 많은 군대를 이끌고 가 면 용이 미리 알아채기 때문에 기사 한 명만이 갈 수 있다. 아더왕은 과연 누구를 보내야 하는 가 고민에 빠졌다.
그러던 중 란슬러트가 묘안을 제시하였다.
- 원탁에 둘러앉아 있는 기사 n 명에게 시계방향으로 차례대로 1 번부터 n 번의 번호를 부여한다.
- 그 중 임의의 숫자 m 을 선택하여 그 번호의 기사를 제외 시킨다
- 다음 그 기사로부터 시계 방향으로 k 번째 있는 기사를 선택하여 제외시킨다.
- 이렇게 제외된 기사로부터 k 번째 있는 기사를 제외시키는 작업을 단 한 명이 남을 때까지 계속한 뒤 그 결과 마지막으로 남은 기사가 용과 싸우러 가는 것이다.
예를 들어 n=8, m=2, k=3 인 경우 2 가 먼저 제외된 후 이어 5 번 8 번 기사가 차례대로 제외된다.
원탁의 기사의 수, 처음 선택한 기사의 번호 , 다음으로 몇 번째 기사를 제외시킬 것인가 하는 가 주어질 때 제외되는 기사들의 번호를 순서대로 출력 한다.
입력 형식
n,m,k 가 차례대로 입력된다. n , m , k 은 2 이상 1000 이하인 정수이다.출력 형식
제외되는 기사들의 번호를 제외되는 순서대로 출력한다. 마지막에 출력된 기사가 선택되는 것이다.입출력 예
입력 8 2 3 출력 2 5 8 4 1 7 3 6
권장 사항
linked list 권장#include <iostream> #include <string> #include <vector> using namespace std; int main() { vector<int> vt; vector<int> ::iterator it; int n,m,k; int i,j; cin>>n>>m>>k; for(i = 1; i<= n ; i++){ vt.push_back(i); } m -=1; for(i = 0;!vt.empty();){ if(i == m){ cout<<vt[i]<<" "; vt.erase(vt.begin() + i, vt.begin()+i+1); if(vt.empty()) break; m += k-1; j = vt.size(); m %= j; } i++; if(i >= vt.size()) i = 0; } return 0; }
5월 4주차 씨앗
매우 큰 길이의 두 개의 수가 입력되었을때 뺄셈을 구하는 프로그램을 작성하시오.
예를 들어, 두 수가 218072345632843258023, 521732147023 일 때,
218072345632843258023
- 521732147023
---------------------
= 218072345111111111000
이 된다.
입력
100 자리 이하의 양의 정수 2 개가 주어진다.출력
두 정수값에 대한 뺄셈의 결과를 출력한다.입출력 예
입력 521732147023 218072345632843258023 출력 -218072345111111111000
출처: 채점 데이터:
참조 : http://211.228.163.31/30stair/linkedlist/linkedlist.php?pname=linkedlist
#include <iostream> #include <string> using namespace std; class node { public : int data; node* n_link; node* p_link; }; int main() { node *p, *q, *p1,*p2, *pr; node *head_a, *head_b, *head_r; node *tail_a,*tail_b,*tail_r; int i,sign = 0, isZero = 1; string str_a; string str_b; string tmp; cin>>str_a>>str_b; if(str_a.size() > str_b.size()){ sign = 0; }else if(str_a.size() == str_b.size()){ if(str_a >= str_b){ sign = 0; }else{ sign = 1; tmp = str_a; str_a = str_b; str_b = tmp; } }else{ tmp = str_a; str_a = str_b; str_b = tmp; sign = 1; } head_a = new node[1]; tail_a = new node[1]; head_a->data = 0; head_a->p_link = '\0'; tail_a->n_link = '\0'; p = head_a; for(i = 0; i < str_a.size() ; i++){ q = new node[1]; q->data = str_a[i] - '0'; q->n_link = '\0'; q->p_link = p; p->n_link = q; tail_a->p_link = q; p = q; } head_b = new node[1]; tail_b = new node[1]; head_b->data = 0; head_b->p_link = '\0'; tail_b->n_link = '\0'; p = head_b; for(i = 0; i < str_b.size() ; i++){ q = new node[1]; q->data = str_b[i] - '0'; q->n_link = '\0'; q->p_link = p; p->n_link = q; tail_b->p_link = q; p = q; } p1 = tail_a->p_link; p2 = tail_b->p_link; head_r = new node[1]; tail_r = new node[1]; head_r->p_link = '\0'; tail_r->n_link = '\0'; p = tail_r; while (1){ q = new node[1]; if(p1->data >= p2->data) q->data = p1->data - p2->data; else{ if(p1->p_link != '\0'){ q->data = 10 + p1->data - p2->data; p1->p_link->data -= 1; //cout<<"zzz"<<endl; }else{ q->data = p1->data - p2->data; } } if(p1 == head_a && p2 == head_b) break; q->n_link = p; q->p_link = '\0'; p->p_link = q; head_r->n_link = q; p = q; if(p1->p_link != '\0') p1 = p1->p_link; if(p2->p_link != '\0') p2 = p2->p_link; } p=head_r->n_link; if(p->data != 0) isZero = 0; if(sign) cout<<"-"; while ( p->n_link != NULL ){ if(p->data != 0) isZero = 0; if(!isZero) printf("%d",p->data); p=p->n_link; } if(isZero) cout<<0; printf("\n"); }
4주차 강의자료입니다.
연산자(비트 논리 연산)
부터 반복문까지입니다.
차주에는 중간고사 대비 리뷰 한번 하고, 기출문제를 한번 풀어보고자 합니다.
2주차 강의자료입니다.
.
1주차 C++ 강의자료입니다.
1. C++?
2. C++의 입출력
3. 함수오버로딩
4. 레퍼런스
5. 구조체
6. 클래스
1주차 강의자료입니다.
1. 변수/상수
2. 자료유형
3. 오버플로우
4. printf / scanf
5. 연산자
6. 조건문(if)
1주차 강의
-사각형 넓이 구하기/area#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); printf("%d", a*b); return 0; } -버터 먹기/butter
|