기본 콘텐츠로 건너뛰기

7월, 2016의 게시물 표시

변수와 배열의 자동 초기화(C++)

변수들이 전역으로 선언 되었는지 지역으로 선언되었는지에 따라서 그 변수가 자동초기화가 될수도 있고 안될수도 있다. 먼저 전역변수 일때 부터 보자. 전역변수일때 변수들은 전역변수로 썼을때 자동 초기화가 된다. 따로 초기화가 되지 않은 int, char, bool은 모두 0으로 자동 초기화가 된다. 배열을 선언할때 초기화를 해주지 않으면 배열 전체가 자동초기화 되며, 일부분만 초기화 시켜주었을떄는 나머지 부분만 자동 초기화 된다. int 와 bool, char을 자동 초기화 시켜볼 거다. bool에서의 0은 false이고 char에서의 0은 null이다. #include <iostream> #include <windows.h> using namespace std; // 자동초기화가될 전역 변수들 int a; int b[10]={3,4}; bool c,d[10]={true,true}; char e; char f[10]={'a','b',}; int main(){     int i;         cout<<"int a = "<<a<<endl;     cout<<"int b[10] = ";     for(i=0;i<10;i++){                       cout<<b[i]<<", ";     }     cout<<endl<<"bool c = "<<c<<"/";     if(c)cout<<"true"<<endl;     else cout<<"false"<<endl;     cout<<"bool d[10] = ";     for(i=0;i<10;i++){       

uva301 수송법(C++)

트랜스 루라타냐라는 철도회사는 A도시에서 B도시까지 가는 기차를 운영 중이다. 기차는 A도시에서 B도시의 종점역까지 가는대 여러 군대의 정차역을 들른다. 종점역을 포함한 정차역의 최대 갯수는 7개이며, 정차역마다 승객들이 타고 내릴 수 있다. 기차는 예약제로 운영 되는데 예약은 단체, 개인을 합쳐서 총 22개의 예약만을 받을 수 있다. 승객 한명당 기차요금은 출발 역에서 도착역 까지 가는데 도착역을 포함한 정차하는 역의 수와 같다. 그리고 각각의 역은 종점역을 포함해서 m개의 역에서 정차한다 했을때, 출발역 부터 0,1 ,2 ..m 으로 이름을 붙힌다. 기차 예약에는 몇명의 승객이 어디서 타서 어디서 내리는지 써있으며, 승객 수 가 제한되어 있기 때문에 승객을 다 수용할 수 없을 때에는 단체, 개인의 예약을 통째로 취소해야 한다. 이때 물론 최대의 이윤이 남게끔 예약을 취소해야 한다. ***예를 들어,  총 0 부터 5까지 총 5개의 정차역을 들르는 기차에 총 10명의 손님이 탈 수 있는데 예약이 3부터 5까지 6명, 0부터 4까지 5명 들어 왔을 때는 최대의 이윤을 남기기 위해 3부터 5까지 6명 예약을 취소해야 한다. 기차당 예약이 다음과 같은 형식으로 입력된다고 하자 첫번째 줄에는 고객 수송 재한n, 종점을 포함한 정차역 개수, 총 예약 개수가 순서대로 입력되고 다음 줄부터 한줄에 예약이 하나씩 다음과 같은 순서로 입력된다. 출발역, 도착역, 승객수. 그리고 또 다른 기차의 예약이 있으면 위와 똑같이 아래에 계속 입력 해준다. 입력은 0이 연속으로 3번 입력되면 끝난다. 출력은 각각의 기차가 낼수 있는 수익을 한줄에 한개씩 출력하면 된다. 문제를 풀기전에 어떤 식으로 풀어야 할지 생각해보자. DFS를 이용해 최대 수송 제한을 넘지 않는 모든 경우를 검색하면서 최대 수익값을 갱신해 주면 되겠다. #include <iostream> #include <windows.h> usi

최단 경로의 길이 구하기(C++)

10 이하의 n을 입력하고 n x n크기의 2차원 수열에 1과 0을 채워넣어 길을 만든다. 1은 길이고 0은 지나갈 수 없다. 출력은 출발점(0,0) 에서부터 도착점(n-1,n-1)에 도달할 수 있는 모든 경로중 가장 짧은 경로의 길이를 출력하면 된다. #include <iostream> #include <windows.h> using namespace std; int a[10][10]; int n,m=100;//최소 경로는 100이 최대이다. void move(int y,int x, int c){           c++;//한칸 움직일 때마다 카운트를 해준다.      if(x==n-1&y==n-1){                        if(m>c)m=c;//최소경로보다 c가 작으면 갱신.                        c=0;                        return;                        }           a[y][x]=0;//경로를 되돌아 오는 것을 막기위해 0으로 바꾼다.      if(x>0&&a[y][x-1]==1)move(y,x-1,c);      if(y>0&&a[y-1][x]==1)move(y-1,x,c);      if(x<n-1&&a[y][x+1]==1)move(y,x+1,c);      if(y<n-1&&a[y+1][x]==1)move(y+1,x,c);           return; } int main(){         int i,j;     cin>>n;         for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>a[i][j];         move(0,0,0);//시작점으로 이동하기전 이동거리는 0이다.     cout<<m<<endl;         system("P

경로의 수(C++)

출발점이(0.0)이고 도착점이 (n-1, n-1)라고 할때, 출발점에서 도착점까지 가는 길의 수를 구하는 프로그렘을 만들어 보자. 1은 지나갈 수 있는 길이고 0은 갈 수 없는 길이다. 입력은 N x N크기의 1과 0으로 이루어진 2차원 수열로 이루어지고 경로의 수를 구해 출력하면 된다.(N은 10이하이다. DFS를 이용해 모든 경우를 순서대로 검색하고 카운트한 다음 출력하면 된다. #include <iostream> #include <windows.h> using namespace std; int a[10][10]; int n,c;//전역변수는 자동으로 0으로 초기화 된다. void move(int y,int x){           if(x==n-1&y==n-1){                        c++;                        return;                        }           a[y][x]=0;//경로를 되돌아 오는 것을 막기위해 0으로 바꾼다.      if(x>0&&a[y][x-1]==1)move(y,x-1);      if(y>0&&a[y-1][x]==1)move(y-1,x);      if(x<n-1&&a[y][x+1]==1)move(y,x+1);      if(y<n-1&&a[y+1][x]==1)move(y+1,x);           return; } int main(){         int i,j;     cin>>n;         for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>a[i][j];         move(0,0);     cout<<c<<endl;         system("PAUSE");         return 0; } 출력 결과 5 1 1 1

깊이 우선 탐색법DFS(Depth First Search )

깊이 우선 탐색법(DFS)는 현재 문제에 대해 접근할 수 있는 모든 경우를 순서대로 접근하는 방식이다. (백트래킹이라고도 한다) 따라서 앞선 순서의 경우가 먼저 깊게 내려가므로 앞선 경우를 따라 끝까지 검색한다음 다시 다른 경우가 있는 이전 깊이로 돌아와서 다른 경우로 깊게 내려가게 된다.   트리로 나타내면 이렇다.    위 의 이미지 파일처럼 1번 부터 7번 순서대로 데이터를 검색하는 것이다.     보통 DFS는 제귀함수로 구현이 가능하다.   한번 DFS를 사용해 보겠다    예를 들어, 반0 고등학교에서는 매주 월요일 부터 금요일 까지 매일 맛있는 점심이 나온다고 한다. 하지만, 문제는 조리사가 만들 수 있는 요리는 3종류 밖에 되지 않는다는 것이다. 조리사가 만들수 있는 요리는 김치 볶음밥,  우동, 스파게티이다. 그렇다면 월요일부터 금요일까지 한주동안 반0고등학교에서 나올수 있는 점심의 급식표들을 모두 출력하는 프로그램을 DFS를 이용해 만들어 보자.       #include <iostream> #include <windows.h> #include <string> using namespace std; string recipe[3] = {"김치볶음밥", "우동", "스파게티"}; int week[5]; //급식표. void menu(int day){      int i;           if(day == 5){             for(i=0;i<5;i++)cout<<recipe[week[i]]<<"//";             cout<<endl;             return;      }//5일 까지 검색하고 한줄띄고 돌아감.           for(i=0 ; i<3;i++){/

프로그래밍에서 시간 복잡도,GetTickCount()(C++)

시간 복잡도란, 문제를 해결하는데 걸리는 시간을 주어진 데이터 N에 비례해서 양적으로 표현하는 방법이다. for( i = 0; i < n;i++);  위와 같은 for나 while 같은 순환문이 한번 돌게 되면 N번이 돌개되는 것이다. 그리고 이중 삼중의 for문은 총 순환 횟수가 N 2  N 3  가 된다. 보통 50,000,000개의 루틴을 처리하는데 1초정도 걸린다. 그럼 프로그램에서 데이터를 처리하는데 걸린 시간을 구체적으로 구해보자 <windows.h>에서 제공하는 GetTickCount()는 시스템이 시작된 이후에 경과된 시간을 1/1000초 단위로 알려준다. #include <iostream> #include <windows.h>//GetTickCount()를 사용하려면 반드시 써주자 using namespace std; int main(){         int n,i,j,a,t;          cin >> n;         t=GetTickCount();         for(i=0; i<n;i++)for(j=0;j<n;j++)a=i+j;         cout << (GetTickCount()-t)/1000. <<endl;//.을 붙혀서 float으 캐스팅한다.             system("PAUSE");         return 0; } 다음과 같은 프로그램을 짠뒤 n에 10000을 대입해 보았다. 총 1억번 순환하게 되므로 이론상 2초가 걸려야 한다. 10000 0.297 Press any key to continue . . . 내 컴이 너무 좋은걸까?? 50,000,000 번 순환하는데 1초가 걸린다는 말은 이젠 너무 오래되서 더이상 맞지 않나보다. 1억번이 0.29초니까. 350,000,000 정도가 1초 걸릴 것이다. 그래서, 한번 19000을 대입해 봤다. 19000을

C++ 프로그래밍에서의 메모리 제한(C++)

Visual C++에서는 배열을 선언할때 매모리 제한으로 258257까지만 할당할 수 있다고 한다. 따라서, 1차원 배열은 [258257]이 최대이고 이차원 대략 [508][508] 삼차원은 대략 [63][63][63]까지 할당할 수 있다고한다. 그래서 직접해봤다. 다음 코드를 작성하면 이런 결과를 볼 수 있다. #include <iostream> using namespace std; int main() {  int a[258258];  cin >> a[0]; return 0; } Unhandled exception at 0x0F3B9B32 (ucrtbased.dll) in example1.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x01042FF4). 오 정말로 스텍오버플로우가 발생한다!!! 이번엔, 배열을 258257까지 선언해보았다. #include <iostream> using namespace std; int main() {  int a[258257];  cin >> a[0];  return 0; } Unhandled exception at 0x770AFA6E (ntdll.dll) in example1.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00602F74). 어라????!! 대체 어디까지 줄여야 스택오버플로우가 안뜨나 해봤다. 그 크기는 항상 달랐다. 대략 250000이하부터 안전해 지는 거 같다. 왠만하면 배열을 100000이상으로 안쓰는게 좋겠다. 게다가 변수를 하나만 선언해 놓고 쓰는것도 아니니까 실질적으로 선언할 수 있는 많이 줄어들 것이다. Dev C++에선 그 크기가 약간 다른거 같다. Dev C++을 이용해본 결과 배열을 [519828]까지 선언할 수 있었다.4byte 짜리 int 변수를

1차원 단지(C++)

1차원 단지란 1이 하나 이상 모여있는 집단을 단지라고 한다. 0과 1로 이루어진 100개의 문자열을 받고 단지에 속하는 1의 갯수를 센뒤 오름차순으로 정렬하여 출력하라 입력 예제) 100011011 출력 예제) 1 2 2 다음과 같은 코드를 짜보자. 1. i 번째 문자열이 1인지 확인한다. 1-1. 1이 참이면, 카운트를 하나 더해준다. 1-2 1이 거짓이면, 카운트가 0보다 큰지 확인한다. 0보다 크면 카운트를 배열에 집어넣고 카운트를 0으로 초기화한다. 2. 1과정을 문자열의 끝까지 반복한다. 3.카운트가 0보다 큰지 확인한다. 0보다 크면 카운트를 배열에 집어넣는다. 오름차순은 일일이 분별과정을 거치지 않고 간단히 sort함수를 사용하겠다 sort: http://khgkjg12.blogspot.kr/2016/07/sort-swap-c.html #include <iostream> #include <windows.h> #include <algorithm> using namespace std; int main(){         int i,count[100],c=0,r=0;     string str;         cin >> str;         for(i=0;i<str.length();i++){                                 if(str[i]=='1') c++;                                 else if(c>0){                                      count[r++]=c;                                      c=0;                                 }     }         if(c>0)count[r++]=c;         sort(count,count+r);         for(i=

1차원 바둑(C++)

'1', '0'은 각각 검은돌과 흰돌을 의미하고 '.'은 공백을 의미한다.  '1', '0', '.'으로 이루어진 문자열을 입력받고 규칙에 의해 1과 0이 따먹은 돌의 양을 출력하라. <<<규칙은 다음과 같다.>>> 1. 같은 색의 돌들을 다른 색의 돌이 둘러싸고 있을 때 둘러싸인 돌은 따먹힌다. 2. 상대편의 돌을 둘러 쌌을 때 상대편 돌안에 공백이 한군데 있고 공백이 3칸 이내일 경우 그돌들을 따먹을 수 있다. 다음과 같은 과정을 거쳐서 따먹은 돌을 카운트 할 수 있다. 1. i번째 문자열이 0인지 확인한다. 1-1 참이면, 1)이전에 0이 있었는지 확인한다. 1-1-1 참이면, 이전 0 뒤에 1이 있고 지금 0 앞에 1이 있는지 확인한다. 1-1-1-1 참이면, 1)이전 0 다음 칸부터 지금 0 전칸 까지 1의 갯수를 센다. 2)그 구간의 공백 구간의 수를 샌다. 3) 그 구간의 연속된 공백의 갯수를 센다. 4)공백구간이 1이하이며 연속된 공백이 3이하이면, 1의 갯수를 따먹은 1 갯수에 더해준다. 1-1  2)이전 0의 위치를 지금 0의 위치로 갱신한다. 2. 1과정을 '1'에 대해서도 행한다. 3. 1과 2를 문자열의 처음부터 끝까지 반복진행한다. #include <iostream> #include <windows.h> #include <string> using namespace std; int main(){         int i,j,num_w=0,num_b=0,c,pre=-1,num_s,ser_s;     string str;         cin >> str;         for(i = 0; i<str.length();i++){           if(str[i] == '0'){     

1차원 오목(C++)

100자 이내의 '1', '0', '.' 으로 구성된 문자열을 입력받고 문자열 내부에 '1'이 연속으로 5개 나오면 "1 win"를 출력하고 '0'이 연속으로 5개 나오면 "0 win"를 출력하라. 또한 승리자가 없을 때는 "no win"을 출력한다. 무승부는 없다. 승리를 판정하는 방법은 간단하다. 특히 <string>에서 제공하는 find()함수를 쓰면 말이다. find 함수 : http://khgkjg12.blogspot.kr/2016/07/string-stringfindc.html 그러나 find를 사용 안하더라도 간단히 판정할 수 있다. 1. c=0; 2.  i번째 배열과 i-1번째 배열이 같은지 확인한다. 2-1. 2이 참이면, c++; 2-2. 2이 거짓이면 c=0; 3.c=5인지 확인한다. 3-1. 3가 참이면, i번째 배열이 '.'인지 확인한다. 3-1-1. 3-1이 참이면, c=0; 3-1-2. 3-1이 거짓이면, i번째 배열의 원소을 얻어내 해당 숫자가 승리하였다고 출력한다. 그리고 순환문을 빠져나온다. 6. 2~3을 i가 1일때부터 문자열의 끝까지 반복한다. 7. i가 문자열의 길이와 같은지 확인한다. 7-1. 7이 참이면, "no win"을 출력한다. #include <iostream> #include <windows.h> #include <string> using namespace std; int main(){     string str;     int i,c=0;         cin >> str;         for(i=1;i<str.length();i++){                                  if(str[i]==str[i-1])c

배열간의 복사함수 copy()(C++)

<algorithm>에서 제공하는 copy(시작위치, 마지막 다음 위치, 복사할 배열 첫번째 위치);는 배열의 일정 부분을 복사하여 다른 배열에 붙여넣는 기능을 한다. 예제) #include <iostream> #include <windows.h> #include <algorithm> using namespace std; int main(){         int i,a[10],b[8]={0};         for(i=0;i<10;i++)a[i]=i; //a={0,1,2,3,4,5,6,7,8,9}         copy(a,a+5,b);//b에 a의 절반을 복사         for(i=0;i<8;i++)cout<<b[i]<<" ";         cout<<endl;         system("PAUSE");         return 0; } 결과) 0 1 2 3 4 0 0 0 Press any key to continue . . .

파스칼 삼각형(C++)

n을 입력받고 파스칼 삼각형의 n번째 열의 수열을 출력하라. (n은 30 이하로 입력한다.) 파스칼 삼각형의 i번째열의 j번째 항을 p[i][j]라고 하면, p[i][j]는 다음과 같다. p[i][j] = p[i-1][j-1] + p[i-1][j] 따라서, 재귀함수로 쉽게 구할 수 있다. #include <iostream> #include <windows.h> using namespace std; int pas(int i, int j){         if(j==1||j==i) return 1;         else return pas(i-1,j-1)+pas(i-1,j); } int main(){         int n,j;         cin >>n;         for(j=1;j<=n;j++)cout<<pas(n,j)<<" ";         cout << endl;         system("PAUSE");         return 0; } 실행결과 8 1 7 21 35 35 21 7 1 Press any key to continue . . . 재귀함수를 사용하는 방법은 코드가 간결해서 좋지만 입력수가 높아질 수록 함수를 훨신 많이 호출하게 되며 그많큼 처리 속도도 느려지며 메모리를 많이 차지하게 된다. 따라서 좀더 메모리를 덜 사용하며 처리속도가 빠른 방법을 생각해보자. 2개의 int 배열을 이용해보자. 하나를 a 나머지를 b라고 해보자. 아래와 같은 방법을 쓰면 n열의 수열을 구할 수 있다. 1. 1열의 수열을 a에 대입한다. 2. a에 저장된 i열의 수열을 이용하여 i+1열의 수열을 b에다 구현한다. 3. b에 저장된 i+1열의 수열을 복사하여 a에 대입한다. 4. 2-3을 a에 n번째 열의 수열이 저장될때가지 n-1번 반복한다. #inc

동전 앞면(C++)

동전을 n개 던저서 앞면이 k개 나오는 경우를 모두 출력하여라. n은 최대 20까지 입력되고 앞면이면 "앞" 뒷면이면 "뒤" 으로 출력하라. 출력결과는 한줄에 하나씩 출력하되 "뒤"가 더 앞쪽에나온 순으로 출력하라. 출력 가장 마지막 줄에는 총 경우의 수를 출력하라. "뒤"가 더 앞쪽에 나오는 순이란 말은 "앞"이 더 뒤쪽에 나오는 순서라는 말과같다. 만약 뒤를 0으로 앞을 1로 본다면, 1의 개수가 같은 것 중에 수가 더 낮은 것 부터 출력하라는 말과 같다. 따라서 다음과 같은 방법을 생각해 볼 수 있다. 이진수로 0부터 1씩 더해가면서 알맞는 1의 갯수가 k 될때만 0과 1을 문자로 바꿔 출력하는 것이다. 이때 물론 0부터 1이 n개 나오는 경우까지만 더하면 된다. 그럼 순환문 안에 다음과 같은 처리 과정이 있어야 겠다. 1.숫자를 1더한다. 2.숫자의 1의 갯수를 센다. 3.1의 갯수와 k가 일치하면 출력한다. 순환문은 1의 갯수가 n개가 되면 빠져나온다. 1번 과정은 어떻게 구현할까? 순환문을 안에 다음과 같은 처리과정을 구현하면 된다. 1.배열의 i번 칸을 1 증가 시킨다. 2.배열의 i번 칸이 2가 되었는지 확인한다. 3.1.참이면 i번칸에 0을 대입하고 i--한다. 3.2거짓이면 순환문을 빠져나온다. i>=0조건을 만족하지 못하면 빠져나와야 한다. 배열의 n-1번 칸부터 증가시켜 주려면 당연히 순환문 전에 i에 n-1을 대입해 줘야 한다. #include <iostream> #include <windows.h> using namespace std; int main(){         int a[20]={0},n,k,i,c,ca=0;         cin >>n >>k;             while(true){                 i=n

2진수 덧셈(C++)

2진수를 2개 입력받고 그 두 수를 더한결과를 2진수로 출력하라. #include <iostream> #include <windows.h> #include <string> using namespace std; int main(){         string a,b;     int s[100],i,j,k=0,l=0;     cin >> a >>b;         i=a.length()-1;     j=b.length()-1;             while(k>0||i >= 0||j>= 0){             if(i>=0) k+=a[i]-'0';                         if(j>=0) k+=b[j]-'0';                         s[l++]=k%2;             k/=2;             i--;             j--;     }         for(l;l>0;l--)cout<<s[l-1];         cout<<endl;         system("PAUSE");         return 0; } 결과 100100 10111 111011 Press any key to continue . . .

10진법을 2진법으로 변환하기(C++)

10진수로 입력받아 2진수로 출력해보자. #include <iostream> #include <windows.h> #include <math.h> using namespace std; int main(){         int t,a=1;//a는 이진수의 자릿수         cin>>t;         while(t>=pow(2,a)){//이진수의 자릿수를 구한다.2^a이 t를 넘어서는 순간의 a가 t의 자리 수이다.                a++;     }         for(a;a>0;a--){//a 자리수는 1~a자리수만 봤을떄, 2^(a-1)보다 같거 크면 a자리수가 1 아니면 0. a부터 1자리까지 자릿수를 구한다.                    if(pow(2,a-1)<=t){                                      cout<<1;                                      t-=pow(2,a-1);//해당 자리수를 1로 만들고 자릿수만큼의 수를 뺸다.                    }else {                          cout<<0;//해당 자릿수는 0이므로 뺄수있는 수가 없다.                    }     }         cout<<endl;         system("PAUSE");         return 0; }    실행결과 21 10101 Press any key to continue . . . 또 다른 방법, int배열에 이진수를 저장한 다음 출력하기. #include <iostream> #include <windows.h> using namespace std; int main(){         int t,d[100]={0},l=0;         cin >>

윤년 구하기(C++)

윤년은 2월 29일 이 있는 년도이다. 2월 29일이 없는 년은 평년이다. 윤년은 다음과 같이 구할 수 있다. 1.4로 나누어 지는 해은 윤년이다. 2.4로 나누어 지는 해중에 100으로 나누어지는 해는 평년이다. 3.100으로 나누어지는 평년중에 400으로 나누어 지는 해는 윤년이다. 그럼, 년도를 입력받아서 윤년인지 평년인지 알아내는 프로그렘을 만들어 보자. 년도를 입력받고 윤년이면 "윤년"을 출력하고 평년이면 "평년"을 출력하자. #include <iostream> #include <windows.h> using namespace std; int main(){         int y;     bool nomal = true;         cin >> y;         if(y%4==0){                if(y%100==0){                             if(y%400==0)nomal=false;                }else nomal = false;     }         if(nomal)cout<<"평년"<<endl;     else cout<<"윤년"<<endl;         system("PAUSE");         return 0; } 실행결과 2016 윤년 Press any key to continue . . .

최대수 구하기(C++)

입력된 수들 중에서 제일 많은 수를 출력하라. 첫줄에 N이 입력되고 다음 줄에 1~50사이의 N개의 자연수가 입력된다. 제일 많은 수가 1가지면 그수를 출력하고 2가지 이상이면 -1을 출력하라. #include <iostream> #include <windows.h> #include <algorithm> using namespace std; int main(){         int N,i,a[50]={0},j,m=0;         bool isonly = true;         cin >> N;         for(i = 0 ; i < N ; i++){           cin>>j;           a[j]++;     }         for(i=1; i<50; i++){              if(a[0]<a[i]){                            swap(a[i],a[0]);                            m=i;//더 많은 자연수로 m 값을 갱신.                            }     }         for(i=1; i<50;i++)if(a[0]==a[i])isonly=false;         if(isonly)cout<<m;     else cout<<-1;         system("PAUSE");     return 0; } 실행 15 34 34 28 2 1 29 3 17 22 19 45 5 11 25 3 -1Press any key to continue . . . 10 3 2 8 7 6 8 6 0 8 9 8Press any key to continue . . .

최대공약수 최소공배수 구하기(C++)

두 자연수를 입력받고 최대공약수 최소공배수 순으로 출력하라. 최대공약수는 뉴클리드 호제법으로 구할 수 있다. 서로다른 두 자연수 a,b의 최대공약수가 r이면 ab는 다음과 같이 나타낼 수 있다, a=cxr, b=dxr 여기서 당연히 c와 d는 서로소인 자연수가 된다. 따라서 a,b중 큰 수에서 작은 수를 빼고 또 그 뺀 값과 작은수를 비교해서 더 작은수를 빼주고 이런 과정을 반복해서 0이될때 가장 마지막 숫자가 최대 공약수가 된다. 최소공배수는 두수의 곱에 최대공약수를 나누면 나온다. #include <iostream> #include <windows.h> #include <algorithm> using namespace std; int main(){         int a,b,g,l;     bool isgcd=false;         cin>>a>>b;         l=a*b;         while(!isgcd){                   if(b>a)swap(a,b);                                     a=a-b;                                     if(a==0){                            g=b;                            isgcd=true;                   }     }         l/=g;     cout << g << endl << l << endl;              system("PAUSE");         return 0;     } 실행결과 24 18 6 72 Press any key to continue . . .

문자열 합계(C++)

영어 대소문자로 된 문자열을 입력받아 a~z는 1~26으로 A~Z는 52~27로 바꿔서 수열의 합을 구하시오. #include <iostream> #include <windows.h> #include <string> using namespace std; int main(){         string a;     int i,sum=0;         cin>>a;         for(i=0;i<a.length();i++){                               if(a[i]<='Z')sum+='Z'-a[i]+27;                               else sum+=a[i]-'a'+1;     }         cout<<sum<<endl;     system("PAUSE");         return 0; }                      실행결과 Marchaprilmay 165 Press any key to continue . . .

문자열 변환(C++)

100자이내로 공백없이 입력되는 숫자와 특수문자로된 문자열을 받아 숫자는 특수문자로 특수문자는 숫자로 변환해서 출력하라. 공백이 없기에 cin>>로 받는게 좋다. 공백이 있다면,  cin>>은 공백을 문자로 읽지 않기 때문에 getline()을 써야 한다. #include <iostream> #include <windows.h> #include <string> using namespace std; int main(){         string a = "1234567890!@#$%^&*()";//입력받은 문자열을 비교해서     string b = "!@#$%^&*()1234567890";//동일한 위치의 문자를 대입한다.     string c;     int i,j;         cin>>c;         for(i=0;i<c.length();i++){                               for(j=0;j<a.length();j++){                                                         if(c[i]==a[j])cout<<b[j];                               }     }         cout<<endl;     system("PAUSE");         return 0; } 시행결과 11234@#$!@(^23096%03%1 !!@#$2341296@#)(^5)#5! Press any key to continue . . . 입력을 char배열로 받을경우 #include <iostream> #include <windows.h> #include <string> #include <cstrin

string에서 문자열 연산(C++)

#include <string> 먼저 string을 선언해주고 [대입] string str = "string example"; [문자열 추가] str += "fabulous program"; [문자열 비교] if(str == "string example) [부분 문자열] str.substr(a,b); 문자열의 str[a]부터 str[a+b-1]까지 잘라서 길이 b를 가진 문자열을 반환한다. [문자열 길이] str.length(); 말그대로 길이다 문자열의 끝 문자는 length()-1위치에 있다. [문자열 찾기] str.find("example"); "example"을 str문자열에서 찾으면 그 문자열의 위치(6)를 반환하고 못찾으면 -1을 반환한다. find를 이용한 예제: http://khgkjg12.blogspot.kr/2016/07/string-stringfindc.html

char배열 형식에서의 문자열(C++)

char 배열 형식에서 문자열을 대입하거나 추가하거나 비교할때는 cstring에서 제공하는 함수들을 사용하는 것이 편하다. [대입] char str[100]; strcpy(str,"Hello world"); 이렇게 하면 str의 첫항부터 10번째 항까지 차례대로 Hello world  가 대입된다. [문자열 추가] strcat(str, "I am pleased"); 이제 11번째 칸부터 차례대로 위의 문자열이 추가된다. [문자열 비교] strcmp(str, "Hello world"); 이 함수는 str과 Hello world가 일치 할때 0이 반환된다. 반환값이 0이 아니면 같은 문자열이 아니다. [문자열 일부분 복사] char cp[100]; strncpy(cp,str+6,5); 이렇게 하면 cp에는 "world"부분만 복사해서 대입된다. [문자열의 길이] strlen(str)은 문자열의 길이를 반환한다. 여기서 반환값으로는 23이 반환된다.

니체의 초인과 종말인간

니체의 초인과 종말인간                   니체의 차라투스트라는 이렇게 말했다 책의 부제에는 다음과 같은 말이 써있다.   "모든사람을 위한, 그러면서도 그 어느 누구를 위한 것도 아닌 책"   이 문장은 이런 뜻을 가졌다.   그 누구도 초인이 될수 있지만 , 아무나 초인이 될 순 없다.     그렇다면 초인이 무엇일까?              '차라투스트라는 이렇게 말했다'는 니체의 가장 유명한 저작 이라고 할 수있다. 이 책은 주인공인 차라투스트라가 산에서 내려와 사람들에게 가르침을 주려고 하는 이야기를 담고 있다. 여기서 차라투스트라는 비록 실재로 존재했던 예언자의 이름을 따왔지만 그것과는 전혀 상관이 없고 오히려 니체 자신을 대변하는 인물로 차라투스트라의 입을 빌려 그의 사상과 생각을 독자들에게 알리고자 한다.    '차라투스트라는 이렇게 말했다'에서 니체는 초인이라는 개념을 만들어 냈다 .   "사람은 극복되어야 할 그 무엇이다."   초인은 자기자신을 극복한 사람이다.         사람들은 흔히 자신을 극복하지 못한다. 사람들을 안락한 삶을 추구하며 위험과 도전에 자신을 내던지려고 하질 않는다. 초인은 위험하고 힘든 상황에 굴복하지 않는다. 초인은 오로지 자기 자신을 극복함으로서 크나큰 즐거움을 느낀다. 우리는 산에오를때 거의 정상에 다다를 때쯤 한발한발 내딧기도 어려운 상황에 직면한다. 그러나 당장 주저앉고 싶은 유혹들을 뿌리치고 한발한발 나아가면서 우리는 우리 자신에게 큰 자부심과 강함을 느낄 수 있게된다.               차라투스트라는 마을 군중들에게 이렇게 말한다. "지금까지 존재하는 모든 것들은 그들 자신을 뛰어넘어, 그들 이상의 것을 창조해 왔다. 그런데도 너희들은 이 거대한 밀물을 맞이하여 썰물이 되기를 자신을 극복하기 보다는

string내부에서 문자열의 위치를 찾는 함수 string.find()(C++)

string 형에서는 다음과 같은 함수를 제공한다. size_type string.find(string sub); sizs_type는 int와 동일하다고 보면 된다. 이 함수는 입력받은 sub와 일치하는 부분을 찾으면 그부분의 위치를 반환하고 찾지 못하면 -1을 반환한다. find함수를 써서 문자열을 찾는 프로그렘을 만들어 보자. 문자열a를 입력받고 그보다 작은 문자열 b를 입력받아서 a에 와 일치하는 부분이 있으면 그 위치를 출력하고 없으면 -1을 출력한다. #include <iostream> #include <string> #include <windows.h> using namespace std; int main(){         string a;     string b;         getline(cin,a);     getline(cin,b);         cout<<a.find(b);         system("PAUSE");         return 0; } 결과  it was the next morning when the big yeller dog came. the 7Press any key to continue . . . 결과에서 보다시피 find함수는 문자열의 왼쪽부터 검사해 나가다가 일치하는 문자열을 발견했을때 리턴값을 반환한다. 그래서 일치하는 부분이 여러군데 있을 경우 가장 첫번째 결과만 출력된다.

문자열 찾기(C++)

80개 이하의 문자로 이루어진 문자열 a과 또다른 문자열 b를 입력받아 a에 b의 문자열이 포함되어있으면 그 위치를 출력하고 그렇지 않으면 -1을 출력한다.  #include <iostream> #include <windows.h> using namespace std; int main(){         string a,b;     int i,j;     bool accord,find;         getline(cin,a);     getline(cin,b);             find = false;         for(i=0;i<=a.length()-b.length();i++){                                           accord = true;                                                                                     for(j=0;j<b.length();j++){                                                                     if(a[i+j]!=b[j]){                                                                                      accord=false;                                                                                      break;                                                                     }                                           }                                           if(accord){