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;
}
'개발 공부 > Algorithm' 카테고리의 다른 글
[LeetCode] 2390. Removing Stars From a String (0) | 2024.12.10 |
---|---|
[LeetCode] 338. Counting Bits (1) | 2024.12.10 |
[LeetCode] 435. Non-overlapping Intervals (0) | 2024.12.08 |
알고리즘 문제 해결 전략 Part02. 알고리즘 분석 (0) | 2020.07.09 |
(New)알고리즘 문제해결전략 Part1-문제 해결 시작하기 (0) | 2020.07.06 |