N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 수를 출력하는 프로그램을 작성해보자.

예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력 한다. 단 910를 뒤집으면 19로 숫자화 해야 한다. 뒤집는 함수인 int reverse(int x) 와 소수인지를 확인하는 함수 bool isPrime(int x)를 반드시 작성하여 프로그래밍 한다.

 

힌트 : 숫자 뒤집는 방법생각하기

소수란? 나눠지는 수가 없는 숫자를 말한다.

 

#include <stdio.h>

int reverse(int x){
	int res = 0;
	while(x>0){
		int tmp = x%10;
		res = res*10 +tmp;
		x= x/10;
	}
	return res;
}

bool isPrime(int x){
	int i;
	bool flag = true;
	
	if(x ==1){
		return false;	
	}
	
	for(i = 2; i < x; i++){
		if(x%i ==0){
			flag=false;
			break;
		}
	}
	
	return flag;
}

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	int n, num, i, tmp;
	scanf("%d",&n);
	for(i = 1; i<=n;i++){
		scanf("%d",&num);
		tmp = reverse(num);
		if(isPrime(tmp)){
			printf("%d ", tmp);
		}
	}
	return 0;
}

N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고,

그 합이 최대인 자연수를 출력 하는 프로그램을 작성해보자.

각 자연수의 자릿수의 합을 구하는 함수를 int digit_sum(int x)로 작성하자.

 

입력 값 txt파일

맨처음숫자 3은 데이터의 수를 표현해준다.

3
125 15232 97

 

힌트 : 버퍼에는 줄바꿈 띄어쓰기 기준으로 들어간다.

자릿수의 합을 구하는 방법을 한번 생각해보자.

 

#include <stdio.h>

using namespace std;

int digit_sum(int x){
	int sum = 0, tmp;
	while(x>0){
		tmp = x%10;
		sum=sum+tmp;
		x=x/10;
	}
	return sum;
}

int main(int argc, char** argv) {
	freopen("input.txt", "rt", stdin);
	int n, num, i, sum, max = -2147000000, res;

	scanf("%d",&n);
	for(int i = 0; i <n; i++){
		scanf("%d",&num);	
		sum = digit_sum(num);
		if(sum > max){
			max = sum;
			res = num;	
		}
	
	}
	
	printf("%d\n",res);
	
	return 0;
}

 

 

 

괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력한다.

 

()의 법칙을 생각하자. )가 먼저 나올수 없고 )의 숫자가 더 많을 수 없다.

미리 머리속에 그려보자.

 

힌트 : 숫자를 기준으로 생각하자.

법칙을 생각해보자.

 

#include <stdio.h>

using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	char a[30];
	gets(a);
	
	int  p = 0;
	int  p2 = 0;
	bool b = true;
	for (int i = 0; a[i] != '\0'; i++) {
	
		if(a[i]==40){
			p++;
		}else if(a[i]==41){
			p--;
		}
		
		if(p < 0){
			break;
		}
	}
	
	if(p  == 0){
		printf("%s","YES");
	}else{
		printf("%s","NO");
	}
	return 0;
}
#include <stdio.h>

using namespace std;

int main(int argc, char** argv) {
	freopen("input.txt", "rt", stdin);
	char a[101],b[101];
	gets(a);
	
	int  p = 0;
	for (int i = 0; a[i] != '\0'; i++) {
		//printf("%d\n", a[i]);
		if (a[i] != 32) {
			if (a[i] >= 65 && a[i] <= 90) {
				//printf("%c", a[i] + 32);
				b[p++] = a[i]+32;
			}
			else if(a[i] >= 97 && a[i] <= 122){
				//printf("%c", a[i]);
				b[p++] = a[i];
			}
		}
	}
	
	b[p] = '\0';
	printf("%s",b);	
	return 0;
}

영어단어가 뛰어쓰기와 대소문자가 혼합되어 표현된다.

뛰어쓰기를 제거하고 소문자로 단어를 출력해보자.

 

1.gets로 문자열을 받아온다.(scanf는 뛰어쓰기에서 멈춘다.)

2.문자열을 확인후 뛰어쓰기는 거른다.

3.대문자는 소문자로 변경한다.

 

힌트: 대문자의 아스키코드 65-90이다.

 

 

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여

그 순서대로 자연수를 만 듭니다.

만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.

 

1.문자열을 입력받거나 읽어온다.

2.문자열에서 숫자만 추출한다.

3.추출된 숫자의 약수를 구한다.

 

힌트: 0~9는 아스키코드 48~57이다.

숫자가 더해질때마다 십의 자리가 증가한다.

 

#include <stdio.h>

using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	char a[100];
	scanf("%s", &a);

	int res = 0, cnt=0;

	for(int i = 0; a[i] !='\0'; i++){
		if(a[i] >= 48 && a[i] <= 57){
			res = res*10+(a[i]-48);
		}
	}
	
	printf("%d\n",res);
	for(int i = 1; i <= res; i++){
		if(res%i == 0){
			cnt ++;
		}
	}
	printf("%d\n",cnt);
	return 0;
}

자연수 N이 주어지면 자연수 N의 진약수의 합을 수식과 함께 출력하는 프로그램을 작성하기.

 

진약수란? 특정숫자를 나누었을때 나머지가 0이 되는 숫자를 말한다.

 

1. N값을 입력받는다.

2. 1부터 N의 진약수를 알아보고 출력한다.

1 + x + x + x + x = x 형식으로 출력하기

 

힌트 : 1은 무조건 진약수이므로 미리 출력해도 된다.

 

#include <iostream>

using namespace std;

int main(int argc, char** argv) {
	int n, i = 2,sum = 1;
	cin >> n;

	cout << "1";

	for (i; i < n; i++) {
		if(n%i == 0){
			cout << " + "<<i ;
			sum += i;
		}
		
	}
	cout << " = "<<sum;
	return 0;
}

자연수 N이 입력되면 1부터 N까지의 수 중 M의 배수합을 출력하는 프로그램을 작성한다.

 

N,M을 입력받고 1~N까지 숫자중에 M의 배수들의 합을 구해보자.

 

기초적인 문제 N,M을 입력받는 코드를 작성한다.

1부터 N까지 반복문을 작성하고 그안에 M의 배수를 확인하는 조건문을 작성한다.

조건에 맞는 수를 sum변수에 넣어준다.

#include <iostream>

using namespace std;

int main(int argc, char** argv) {
	int n, m, i = 0, sum = 0;
	cin >> n;
	cin >> m;

	for (i; i <= n; i++) {
		if (i%m == 0) {
			sum += i;
		}
	}
	cout << sum;
	return 0;
}

알고리즘을 공부해야하는 이유


알고리즘을 공부해야하는 이유 

-좋은프로그램을 만들기위해

-프로그램을 평가하기 위해

-프로그램을 효율적으로 작성하기위해

-프로그래밍 기술을 향상시키기 위해


알고리즘은 프로그램을 설계할때 사용된다.

좋은 프로그램이란 무엇인지 생각해보자.


좋은 프로그램이란?

속도가 빨라야하고 효율적으로 구동되고 범용성이 높아야한다.


범용성이란?

어떤 제약 조건도 없이 넓은 분야에 응용할 수 있는 성질이라고 생각하면된다,


속도,효율,범용성은 여러사람이 같은 프로그램을 설계하더라도

사람마다 알고리즘이 다르기때문에 각각 차이가 난다.


위에서 말한것처럼 좋은 알고리즘은 좋은 프로그램을 만든다.

간단하면서 당연한 알고리즘을 공부해야하는 이유이다.


알고리즘을 공부하는 방법

알고리즘을 공부한다는 것은 잘알려진 알고리즘을 분석하고 파악하는것으로

시작하는게 좋다.


아무것도 모르는 상태에서 알고리즘을 만들어내는건 쉽지않다.

즉, 알려진 알고리즘을 분석하고 파악하면 머릿속에 개념이 잡힐것이고

또 일부내용을 이용하거나 수정하여 사용할 수 있다.


알고리즘의 조건

-정확한 결과 얻기

알고리즘은 문제를 해결하기 위한 절차인데 문제가 해결될려면 정확한 결과가 나와야한다.

-종료

INPUT을 통해 OUTPUT을 가져올려면 프로그램은 마무리 지어져야한다.

중간에 무한루프에 빠져 종료되지않으면 알고리즘으로 볼 수 없다.


참고문헌 -처음만나는 알고리즘

알고리즘이란?


'문제나 과제를 해결하기 위한 처리 절차를 

구체적인 순서에 따라 표현한 아이디어나 생각'을 말한다.


위에서 말했던 알고리즘은 아이디어나 생각이라고 말했었는데

아이디어나 생각은 전달할 수 없기에 눈에 보이도록 표현해야 한다.


알고리즘을 어렵게 생각할 필요가 없다.

단어만 어색할 뿐이지 우린 알고리즘을 어디서든 적용하고 있었다.

일상생활에 쓰는 음식레시피, 가구 조립설명서 등도 알고리즘의 예(시각화)로 볼 수 있기 때문이다.


음식 레시피를 검색해보면 블로그 등에서 사진을 조리법 순서대로 나열한 걸 볼 수 있다.

즉, 요리를 완성하기 위한 절차알고리즘이라 하고

음식 레시피는 그 절차를 순서에 따라 표현한 시각적으로 표현한 것이다.


INPUT(음식 재료) -> 알고리즘(조리법) -> OUTPUT(완성된 음식)

으로 생각하면 된다.


위 음식 조리 알고리즘을 음식 레시피로 만든 것처럼

알고리즘을 프로그래밍언어(C, JAVA등)로 만들면 프로그램이 된다.


프로그램을 작성할 땐 기획, 설계 순으로 진행되는데


고객의 요구에 의해 기획하고 설계할 때 필요한 것이 알고리즘이다.

우리가 만들 프로그램의 설계서를 만든다고 생각하면 된다.


설계하게 될 때 좋은 알고리즘은 4가지를 충족해야 한다.

1. 알기쉽다.

-여러 명이 작업할 때 이해하기 어렵다면 실수가 생기기 마련이다.

또한 혼자서 한다 해도 수정, 추가에 어려움이 있을 수 있다.


2. 속도가 빠르다.

-INPUT, OUTPUT이 같다 해도 처리하는 시간은 현저히 다를 수 있다.


3. 효율적이다.

-같은 작업을 10명이 하는 것과 1명 이서하는 것이 같다면

1명 이하는 로직을 선택하면 9명은 다른 일을 할 수 있다.


4. 재이용하기 쉽다.

-프로그래밍은 한번 만들고 사용하지 않는 것이 아니기 때문에

다른 곳에서 쉽게 재이용 할 수 있도록 만드는 게 좋다.

+ Recent posts