본문 바로가기

개발 공부/Algorithm

it 취업을 위한 알고리즘 문제풀이 - 1. 코드 구현력 기르기

it 취업을 위한 알고리즘 문제풀이 - 1. 코드 구현력 기르기

 

1.1 1부터 N까지의 M의 배수합

 

#include <iostream>
using namespace std;

int main()
{
	int m, n;
	cin >> m >> n;
	int i, sum = 0;
	for (i = 1; i <= n; i++) {
		if (i % m == 0) {
			sum += i;
		}
	}
	cout << sum;
	return 0;
}

 

1.2 자연수의 합

 

자연수 A, B가 주어지면 A부터 B까지의 합과 수식을 함께 출력하시오.

#include <iostream>
using namespace std;

int main() {
	int a, b, sum = 0;
	cin >> a >> b;
	for (int i = a; i <= b; i++) {
		sum += i;
		cout << i;
		if (i != b)
			cout << "+";
		else
			cout << "=";
	}
	cout << sum;
	return 0;
}

 

1.3 진약수의 합

 

자연수 N이 주어지면 자연수 N의 진약수의 합을 수식과 함께 출력.

#include <iostream>
using namespace std;

int main() {
	int n, sum = 0;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		if ((n % i != 0)||(i==n))
			continue;
		else {
			if (i != 1)
				cout << "+";
			cout << i;
			sum += i;
		}
	}
	cout << "=" << sum;
	return 0;
}

다른 풀이)

#include <iostream>
using namespace std;

int main() {
	int n, i, sum = 0;
	cin >> n;
	cout << "1";
	for (i = 2; i < n; i++) {
		if (n % i == 0) {
			cout << "+" << i;
			sum += i;
		}
	}
	cout << "=" << sum;
	return 0;
}

 

* 공통되는 부분은 미리 서술하기!

 

 

1.4 나이 차이

 

N명의 나이가 입력된다, N명의 사람 중 나이 차이가 많이 나는 경우를 출력.

 

#include <iostream>
using namespace std;

int main() {
	int n, i, a, max = -2147000000, min = 2147000000;
	cin >> n;
	for (i = 1; i <= n; i++) {
		cin >> a;
		if (a > max) max = a;
		if (a < min) min = a;
	}
	cout << max - min;
	return 0;
}

 

* max, min은 임의의 값으로 입력하기

 

1.5 나이 계산

 

주민번호가 입력되면 이것을 판독해서 나이와 공백을 구분해서 출력한다.

 

#include <iostream>
#include <cstring>
using namespace std;

int main() {
	string i;
	cin >> i;
	int a, s;
	a = atoi(i.substr(0, 2).c_str());
	s = atoi(i.substr(7, 1).c_str());
	if (s == 3 || s == 4) {
		a = 2000 + a;
		a = 2020 - a;
	}
	else {
		a = 1900 + a;
		a = 2020 - a;
	}
	cout << a << " ";
	if (s == 2 || s == 4) {
		cout << "W";
	}
	else
		cout << "M";
	return 0;
}

 

다른 답)

 

* scanf, printf가 대용량 파일을 잘 읽어들이니 알고리즘 대회에선 cin, cout보다 권장됨.

#include <iostream>
#include <cstring>
using namespace std;

int main() {
	freopen("input.txt", "rt", stdin);
	/* rt : read text,
	stdin = cin */
	int year, age;
	char a[20];
	scanf("%s", a);
	if (a[7] == '1' || a[7] == '2') year = 1900 + ((a[0] - 48) * 10 + (a[1] - 48));
	else year = 2000 + ((a[0] - 48) * 10 + (a[1] - 48));
	age = 2019 - year + 1;
	printf("%d", age);
	if (a[7] == '1' || a[7] == '3') printf("M\n");
	else printf("W\n");
	return 0;
}

* 0은 아스키 코드 값 48이다.

 

 

1.6 숫자만 추출

 

문자, 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출해 그 순서대로 자연수를 만드는 문제

 

#include <iostream>
#include <cstring>
using namespace std;

int main() {
	char s[51];
	char a[51];
	scanf_s("%s", s, 51);
	s[strlen(s)-1] = '\0';
	int p = 0;
	for (int i = 0; i < strlen(s); i++) {
		if ((s[i] >= 48) && (s[i] <= 57))
			a[p++] = s[i];
	}
	a[p] = '\0';
	cout << atoi(a) <<'\n';
	
	int a2 = atoi(a);
	int num = 1;
	for (int i = 2; i <= a2; i++) {
		if (a2 % i == 0) num++;
	}
	cout << num;
	return 0;
}

다른 답)

#include <iostream>
#include <cstring>
using namespace std;

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

 

* 10의 배수마다 10을 곱하기!!!!!

* a[i] != '\0'

 

1. 7. 영어 단어 복구(문자열 컨트롤)

 

영어단어가 뛰어쓰기와 대소문자가 혼합되어 있을 때

원래의 표현대로 공백 제거하고, 소문자화 시켜서 출력하기.

#include <iostream>
#include <cstdio>
#include <cctype>
using namespace std;

int main() {
	char a[110];
	char b[110];
	int p = 0;
	fgets(a, sizeof(a), stdin);
	for (int i = 0; a[i] != '\0'; i++) {
		if(a[i] != ' ')
			b[p++] = tolower(a[i]);
	}
	b[p] = '\0';
	cout << b << endl;
	return 0;
}

 

* 일반적인 입력은 space를 문자열의 끝으로 인식하니 꼭 fgets 함수로 받을 것

 

 

다른 답)

#include <iostream>
#include <cstdio>
#include <cctype>
using namespace std;

int main() {
	char a[101], b[101];
	int i, p = 0;
	fgets(a, sizeof(a), stdin);
	for (i = 0; a[i] != '\0'; i++)
	{
		if (a[i] != ' ') {
			if (a[i] >= 65 && a[i] <= 99) {
				b[p++] = a[i] + 32;
			}
			else b[p++] = a[i];
		}
	}
	b[p] = '\0';
	printf("%s\n", b);
	return 0;
}

 

 

 

1.8. 올바른 괄호(문자열 컨트롤)

 

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

 

#include <iostream>
#include <stack>

using namespace std;

int main() {
	char s[50];
	scanf_s("%s", &s, 50);
	
	stack<char> stack;
	int correct = 1;
	for (int i = 0; s[i] != '\0'; i++) {
		if (s[i] == '(') {
			stack.push(s[i]);
		}
		else {
			if (stack.empty())
			{
				correct = 0;
				continue;
			}
			stack.pop();
		}
	}
	if (correct)
		printf("YES\n");
	else
		printf("NO\n");	
	return 0;
}
#include <iostream>
#include <stack>

using namespace std;

int main() {
	char a[100];
	int i, cnt = 0;
	scanf("%s", &a);
	for (i = 0; a[i] != '\0'; i++) {
		if (a[i] == '(') cnt++;
		else if (a[i] == ')') cnt--;
		if (cnt < 0) break;
	}
	if (cnt == 0) printf("YES\n");
	else printf("NO\n");
	return 0;
}

 

1.9 모두의 약수(제한시간 1초)

 

자연수 N이 입력되면 1부터 N까지의 각 숫자의 약수의 개수를 출력하는 것

#include <iostream>
#include <stack>

using namespace std;

int main() {
	int cnt[50000] = { 0, };
	int n;
	scanf_s("%d", &n, sizeof(n));
	for (int i = 0; i < n; i++) {
		for (int j = i; j < n; j=j+(i+1)) {
			if ((j + 1) % (i + 1) == 0) {
				cnt[j]++;
			}
		}
		cout << cnt[i] << " ";
	}
	cout << endl;
	return 0;
}

 

1.10 자릿수의 합

 

N개의 자연수의 각 자릿수의 합을 구하고 그 합이 최대인 자연수를 출력한다.

#include <iostream>
#include <stack>

using namespace std;
int digit_sum(int x) {
	int sum = 0;
	while (x > 0) {
		sum += (x % 10);
		x /= 10;
	}
	return sum;
}

int main() {
	int N;
	int cnt[100];
	int max = -999;
	int temp;
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> cnt[i];
	for(int i = 0; i < N; i++) {
		int a = digit_sum(cnt[i]);
		if (max < a) {
			max = a;
			temp = i;
		}
		else if (max == a) {
			if (cnt[i] > cnt[temp])
				temp = i;
		}
	}
	cout << cnt[temp] << endl;
	return 0;
}

 

1.11 숫자의 총 개수(small)

 

자연수 N이 입력되면 1부터 N까지 각 자리으ㅢ 자연수가 몇 개가 쓰였는지를 구하는 프로그램

#include <iostream>

using namespace std;

int main() {
	int N;
	cin >> N;
	int sum = 0;
	for (int i = 1; i <= N; i++) {
		int tmp = i;
		while (tmp > 0) {
			tmp = tmp / 10;
			sum++;
		}
	}
	printf("%d\n", sum);
	return 0;
}


 

 

1.12 숫자의 총 개수(large: 제한시간 1초)

#include <iostream>

using namespace std;
bool isPrime(int x) {
	for (int i = 2; i * i < x; i++) {
		if (!(x % i)) return false;
	}
	return true;
}
int main() {
	int a = 87654321;
	int res=0;
	//9->99->999
	int c = 9, d = 0, j = 1;
	while (true) {
		if ((a - c) >= 0) {
			res += (c * j++);
		}
		else {
			res += (a - d) * j++;
			break;
		}
		d = 10 * d + 9;
		c *= 10;
	}
	printf("%d\n", res);

	return 0;
}
#include <iostream>

using namespace std;

int main() {
	int n, sum = 0, c = 1, d = 9, res = 0;
	scanf_s("%d", &n, sizeof(2));
	while (sum + d < n) {
		res = res + (c * d);
		sum = sum + d;
		c++; d = d * 10;
	}
	res = res + ((n - sum) * c);
	printf("%d\n", res);
	return 0;
}

 

1.13 가장 많이 사용된 자릿수

 

N자리 자연수가 입력되면 자연수의 자릿수 중 가장 많이 사용된 숫자를 출력

 

#include <iostream>

using namespace std;

int main() {
	int cnt[10] = { 0, };
	char a[101];
	scanf_s("%s", &a, 101);
	for (int i = 0; a[i] != '\0'; i++) {
		int digit = a[i] - 48;
		cnt[digit] ++;
	}
 	int max = -999, temp;
	for (int i = 0; i < 10; i++) {
		if (max < cnt[i]) {
			temp = i;
			max = cnt[i];
		}
		else if (max == cnt[i]) {
			temp = i;
		}
	}
	printf("%d\n", temp);
	return 0;
}

 

* 숫자가 10자리를 넘어가면 꼭 char나 string 배열로 입력받기

 

 

1.14 뒤집은 소수

 

N개의 자연수가 입력되면 그 자연수를 뒤집고, 뒤집은 수가 소수면 그 수를 출력한다.

 

 

#include <iostream>

using namespace std;
int reverse(int x) {
	int t[10] = { 0, };
	int i = 0, res = 0;
	while(x > 0) {
		t[i++] = (x % 10);
		x /= 10;
	}
	for (int j = 0; j < i; j++) {
		res += t[j] * pow(10, (i - j - 1));
	}

	return res;
}
bool isPrime(int x) {
	int n[100000] = { 0, };
	if (x == 1) return false;
	for (int i = 2; i <= x / 2; i++) {
		if (x % i == 0)
			return false;
	}
	return true;
}
int main() {
	int n;
	int a[100];
	int res[100];

	scanf_s("%d", &n, sizeof(n));
	int j = 0;
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &a[i], sizeof(int));
		int r = reverse(a[i]);
		if (isPrime(r))
			res[j++] = r;
	}
	for (int i = 0; i < j; i++)
		printf("%d ", res[i]);
	printf("\n");
	return 0;
}

 

1.15 소수의 개수

 

1부터 N까지의 소수 개수 출력

 

#include <iostream>

using namespace std;
bool isPrime(int x) {
	for (int i = 2; i*i < x; i++) {
		if (!(x % i)) return false;
	}
	return true;
}
int main() {
	int n=20;
	scanf_s("%d", &n, sizeof(n));
	int r[200000] = { 0, };
	int cnt = 0;
	for (int i = 2; i <= n; i++) {
		if (!r[i]) {
			for (int j = 0; j <= n; j = j + i) {
				if(!r[j]) r[j]++;
			}
			if (isPrime(i)) cnt++;
		}
		
	}
	printf("%d\n", cnt);

	return 0;
}

 

* 소수 판별은 제곱근까지만 보면 된다!!!!

 

1.16 Anagram

 

알파벳을 재배열했을 때 상대편 문자와 같아지는지 여부를 출력

#include <iostream>
#include <algorithm>
using namespace std;
int a[60], b[60];
int main() {
	char str[100];
	scanf_s("%s", &str, 100);
	for (int i = 0; str[i] != '\0'; i++) {
		if (str[i] >= 65 && str[i] <= 90) {
			a[str[i] - 64]++;
		}
		else a[str[i] - 70]++;
	}


	scanf_s("%s", &str, 100);
	for (int i = 0; str[i] != '\0'; i++) {
		if (str[i] >= 65 && str[i] <= 90) {
			b[str[i] - 64]++;
		}
		else b[str[i] - 70]++;
	}

	for (int i = 1; i <= 52; i++) {
		if (a[i] != b[i]) {
			printf("NO");
			exit(0);
		}
	}

	printf("YES\n");
	return 0;
}

 

1.17 선생님 퀴즈

 

학생이 N명 있을 때, 학생들에게 퀴즈를 냈다.

각 학생들은 1부터 자기 카드에 적히 숫자까지의 합을 구하면 된다.

#include <iostream>
#include <algorithm>
using namespace std;
int a[60], b[60];

bool isRight(int a, int b) {
	int sum = a * (a + 1) / 2;
	if (sum == b) return true;
	else return false;
}

int main() {
	int n;
	int a, b;
	scanf_s("%d", &n, sizeof(n));
	for (int i = 0; i < n; i++) {
		scanf_s("%d %d", &a, &b, sizeof(a), sizeof(b));
		if (isRight(a, b)) {
			printf("YES");
		}
		else {
			printf("NO");
		}
	}

	return 0;
}

 

 

1.18 층간 소음

 

센서가 있는데, 각 세대의 층간 진동소음 측정치를 초단위로 아파트 관리실에 전송한다. 한 세대 측정치가 M값을 넘으면 세대호수와 작은 경보음이 관리실 모니터에서 울린다. 한 세대의 N초 동안의 실시간 측정치가 주어지면 최대 연속으로 경보음이 울린 시간을 구하시오. 경보음이 없으면 -1.

 

자연수와 M이 주어지고, N개의 측정값이 초 순서대로 주어짐.

최대 연속 경보음이 울린 시간을 출력하시오.

 

#include <iostream>
#include <algorithm>
using namespace std;
int a[60], b[60];

int main() {
	int n, m, cnt[100];
	int max = -9999;
	int temp = 0;
	scanf_s("%d %d", &n, &m, sizeof(n), sizeof(n));
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &cnt[i], sizeof(cnt[i]));
	}

	for (int i = 0; i < n; i++) {
		if (cnt[i] > m) temp++;
		else {
			if (max < temp) max = temp;
			temp = 0;
		}
	}
	if (max < temp) max = temp;
	printf("%d\n", max);
	return 0;
}

 

 

1.19. 분노 유발자

 

한 줄에 앉은키 정보가 주어지면 뒷사람 모두의 시야를 가려 영화 시청이 불가능하게 하는 분노 유발자가 몇 명이 있는지 알아보자.

 

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int n;
	int s[100];
	scanf_s("%d", &n, sizeof(n));
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &s[i], sizeof(s[i]));
	}
	int cnt = 0, max=-9999;
	for (int i = n-1; i>=0; i--) {
		if (s[i] > max) cnt++;
		if (max < s[i]) max = s[i];
	}
	cnt--;
	printf("%d\n", cnt);
	return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int n;
	int s[100];
	scanf_s("%d", &n, sizeof(n));
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &s[i], sizeof(s[i]));
	}
	int cnt = 0, max=-9999;
	for (int i = n-1; i>=0; i--) {
		if (s[i] > max) { cnt++;
        	max=h[i];
        }
	}
	cnt--;
	printf("%d\n", cnt);
	return 0;
}

 

 

1.20 가위바위보(기본코딩 설계)

1-가위, 2- 바위, 3-보

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int a[101], b[101];
	int n;
	scanf_s("%d", &n, sizeof(n));
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &a[i], sizeof(a[i]));
	}
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &b[i], sizeof(b[i]));
	}
	for (int i = 0; i < n; i++) {
		if (a[i] == b[i]) printf("D\n");
		else if (a[i] == 1 && b[i] == 3) printf("A\n");
		else if (a[i] == 2 && b[i] == 1) printf("A\n");
		else if (a[i] == 3 && b[i] == 2) printf("A\n");
		else printf("B\n");
	}
	return 0;
}

 

 

1.21. 카드게임(기본코딩설계)

 

A와 B가 게임을 한다. A와 B에게는 각각 0에서 9까지 숫자가 하나씩 표시된 10장의 카드뭉치가 주어진다. 두 사람은 카드를 임의의 순서로 섞고 게임을 시작한다.

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int n = 10;
	int a[10], b[10];
	for (int i = 0; i < n; i++)
		scanf_s("%d", &a[i], sizeof(a[i]));
	for (int i = 0; i < n; i++)
		scanf_s("%d", &b[i], sizeof(b[i]));
	int sum_a = 0, sum_b = 0, temp = 0;
	for (int i = 0; i < n; i++) {
		if (a[i] == b[i]) {
			sum_a += 1;
			sum_b += 1;
		}
		else if (a[i] > b[i]) {
			sum_a += 3;
		}
		else {
			sum_b += 3;
		}
	}
	printf("%d %d\n", sum_a, sum_b);
	if (sum_a == sum_b) {
		int j = 0;
		for (j = n - 1; j > 0; j--) {
			if (a[j] > b[j])
			{
				printf("A\n"); break;
			}
			else if (a[j] < b[j]) {
				printf("B\n"); break;
			}
		}
		if (j == 0) printf("D\n");
	}
	else if (sum_a > sum_b) {
		printf("A\n");
	}
	else {
		printf("B\n");
	}
	return 0;
}

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int i, A[10], B[10], as = 0, bs = 0, lw = 0;
	for (i = 0; i < 10; i++) {
		scanf("%d", &A[i]);
	}
	for (i = 0; i < 10; i++) {
		scanf("%d", &B[i]);
	}
	for (i = 0; i < 10; i++) {
		if (A[i] > B[i]) {
			as = as + 3;
			lw = 1;
		}
		else if (A[i] < B[i]) {
			bs = bs + 3;
			lw = 2;
		}
		else {
			as += 1;
			bs += 1;
		}
	}
	printf("%d %d\n", as, bs);
	if (as == bs) {
		if (lw == 0) printf("D\n");
		else if (lw == 1) printf("A\n");
		else printf("B\n");
	}
	else if (as > bs) printf("A\n");
	else printf("B\n");
	return 0;
}

 

1.22 온도의 최댓값(1차원 배열 구간합)

 

N일 중, 연속된 K일의 온도 합의 값이 가장 큰 값을 구하면 된다.

 

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, k;

	scanf_s("%d %d", &n, &k, sizeof(n), sizeof(k));
	vector<int> t(n);
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &t[i], sizeof(t[i]));
	}
	int sum=0;
	for (int i = 0; i < k; i++) {
		sum += t[i];
	}
	int max = sum;
	for (int i = k; i < n; i++) {
		sum = (sum - t[i - k] + t[i]);
		if (sum > max) max = sum;
	}
	printf("%d\n", max);
	return 0;
}

 

 

1.23 연속 부분 증가수열

n개의 자연수가 탐색하면서 증가하는 수열의 최대 길이를 탐색하면 된다.

 

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		scanf_s("%d", &a[i], sizeof(a[i]));
	}
	int cnt = 1, max = -99999;
	for (int i = 1; i < n; i++) {
		if (a[i] >= a[i - 1]) {
			cnt++;
			if (max < cnt) max = cnt;
		}
		else {
			cnt = 1;
		}
		
	}
	printf("%d\n", max);

	return 0;
}

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	int pre, now, cnt, max;
	scanf("%d", &pre);
	cnt = 1; max = 1;
	for (i = 2; i <= n; i++) {
		scanf("%d", &now);
		if (now >= pre) {
			cnt++;
			if (cnt > max) max = cnt;

		}
		else cnt = 1;
		pre = now;
	}
	printf("%d\n", max);
	return 0;
}

 

 

1.24 Jolly Jumpers.

N개의 숫자가 있을 때 인접한 두 수의 차가 1에서 N-1까지 있으면 그 수열을 jolly jumper라고 부른다.

 

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	int pre, now, pos, i;
	vector<int> ch(n);
	scanf_s("%d", &pre, sizeof(pre));
	for (i = 1; i < n; i++) {
		scanf_s("%d", &now, sizeof(now));
		pos = abs(pre - now);
		if (pos > 0 && pos < n && ch[pos] == 0) ch[pos] = 1;
		else {
			printf("NO\n");
			return 0;
		}
		pre = now;
	}
	 printf("YES\n");
	return 0;
}

 

 

 

1.25 석차 구하기

 

N명의 생의 수학점수가 입력되면 각 학생의 석차를 입력된 순서대로 출력하라

 

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	int a[101], b[101] = { 0, };
	scanf_s("%d", &n, sizeof(n));
	for (int i = 0; i < n; i++)
		scanf_s("%d", &a[i], sizeof(a[i]));
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (a[j] > a[i]) b[i]++;
		}
	}
	for (int i = 0; i < n; i++) {
		printf("%d ",++b[i]);
	}
	printf("\n");
	return 0;
}

 

1.26 마라톤

 

N개의 정수를 차례대로 입력받는다.

현재 달리고 있는 선수의 평소 실력이 각각 2,8, 10, 7, 1, 9, 4, 15라고 하면 각 선수가 얻을 수 있는 최선의 등수는 1, 1, 1, 3, 5, 2, 5, 1이 된다. 예를 들어 4번째로 달리는 7인 선수는 그 앞에서 달리고 있는 선수들 중 평소 실력이 2번인 선수를 앞지르는 것이 가능하므로, 최선의 등수는 3등이 된다.

 

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	int i, j, cnt = 0;
	scanf_s("%d", &n, sizeof(n));
	vector<int> a(n + 1);
	for (i = 1; i <= n; i++) {
		scanf_s("%d", &a[i], sizeof(a[i]));

	}
	printf("1 ");
	for (i = 2; i <= n; i++) {
		cnt = 0;
		for (j = i - 1; j >= 1; j--) {
			if (a[j] > a[i]) cnt++;
		}
		printf("%d ", cnt + 1);
	}
	return 0;
}

 

1.27 N!의 표현법(소인수 분해 응용)

 

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	vector<int> c(n + 1);
	
	printf("%d! = ", n);
	for (int i = 2; i <= n; i++) {
		int j = 2;
		int temp = i;
		while (true) {
			
			if (temp % j == 0) {
				temp = temp / j;
				c[j]++;
			}
			else j++;
			if (temp == 1) break;
		}
	}
	for (int i = 2; i <= n; i++)
	{
		if (c[i] != 0) printf("%d ", c[i]);
	}
	return 0;
}

 

 

 

 

1.28 N!에서 0의 개수

 

N! 값에서 일의 자리부터 연속적으로 0이 몇개 있는지 구하는 프로그램

 

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	int c_2 = 0, c_5 = 0;
	for (int i = 2; i <= n; i++) {
		int tmp = i;
		int j = 2;
		while (true) {
			if (tmp % j == 0) c_2++;
			else break;
			tmp /= j;
		}
		j = 5;
		while (true) {
			if (tmp % j == 0) c_5++;
			else break;
			tmp /= j;
		}
	}
	if (c_2 > c_5) printf("%d\n", c_5);
	else printf("%d\n", c_2);
	return 0;
}

 

29. 3의 개수는?(small)

 

1부터 N까지 자연수를 종이에 적을 때 각 숫자 중 3의 개수가 몇 개가 있는지.

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	int cnt = 0;
	for (int i = 2; i <= n; i++) {
		int temp = i;
		while (temp > 0) {
			if (temp % 10 == 3) cnt++;
			temp = temp / 10;
		}
	}
	printf("%d\n", cnt);
	return 0;
}

 

30. 3의 개수는?(large)

 

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	int n;
	scanf_s("%d", &n, sizeof(n));
	int tmp = n;
	int cnt = 0;
	int p_pos = 1;
	int pos = 10;
	while (tmp > 0) {
		int b = tmp % 10;
		cnt += (n/pos) * (p_pos);
		
		if (b > 3)
		{
			cnt += p_pos;
		}
		else if (b == 3) {
			int c = n % p_pos;
			(++cnt) += c;
		}
		p_pos = pos;
		pos *= 10;
		tmp /= 10;
	}
	printf("%d\n", cnt);
	return 0;
}

 

 

1.31 탄화수소 질량

 

C와 H로만 이루어진 화합물의 질량을 구하시오.

#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

int main() {
	char a[10];
	int c = 0, h = 0, pos;
	scanf_s("%s", &a, 10);
	int i = 0;
	if (a[1] == 'H') {
		c = 1;
		pos = 1;
	}
	else {
		for (i = 1; a[i] = 'H'; i++) {
			c = c * 10 + (a[i] - 48);
		}
		pos = i;
	}
	if (a [pos + 1]== '\0' ) h = 1;
	else {
		for (i = pos + 1; a[i] != '\0'; i++) {
			h = h * 10 + (a[i] - 48);
		}
	}
	printf("%d\n", c * 12 + h);
	return 0;
}