[알고리즘] 문제풀이 연습

[알골 90제] 15/16/17

ddgoori 2019. 7. 18. 22:41

15번 - 소수의 개수

 

자연수 N이 입력되면 자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요. 만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다. 제한시간은 1초입니다. 

 

입력: 20

출력: 8

 

// 15번 - 소수의 개수 (제한 시간 1초)
// 제한시간 넘어버림
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int N, cnt = 0;
	scanf("%d", &N);

	for (int i = 2; i <= N; i++) { //1은 소수가 아님
		//flag가 1이면 소수
		int flag = 1;
		for (int j = 2; j * j<= i; j++) {
			if (i % j == 0) {
				flag = 0;
				break;
			}
		} // i의 제곱근만 확인해보면 됨
		 // 즉 j*j <= i
		//나눠서 0인게 없으면 flag는 여전히 1 즉, 해당 i는 소수이다
		if (flag == 1) cnt++;
	}
	printf("%d\n", cnt);
	return 0;
}

 

 

 

16번 - 아나그램

 

Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 합니다. 예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다. 길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세 요. 아나그램 판별시 대소문자가 구분됩니다.

 

입력예제

AbaAeCe

baeeACA

 

출력예제

YES

// 16번 - 아나그램

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>

//알파벳 소문자+대문자 합친 수 (비교용_
//전역으로 선언하면 0이 채워져있음
int a[60], b[60];

int main() {

	char str[100];
	int i;
	scanf("%s", &str);

	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", &str);

	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++) //52는 알파벳 소문자 대문자 합한 수
		if (a[i] != b[i]) {
			printf("NO");
			exit(0);
		}

	printf("YES");
}

*첫번째 문자들도 str에, 두번째 문자들도 str에 str은 하나만 사용해도 된다.

 

 

 

 

17번 - 선생님 퀴즈

 

현수네 반은 학생이 N명 있습니다. 수업도중 선생님이 잠깐 자리를 비워야 하는데 그 동안 학 생들이 떠들거나 놀지 않도록 각 학생들에게 퀴즈를 냈습니다. 선생님은 각 학생들에게 숫자가 적힌 카드를 줬습니다. 각 학생들은 1부터 자기 카드에 적힌 숫자까지의 합을 구하는 퀴즈입니다. 선생님이 돌아와서 각 학생들의 답이 맞았는지 확인을 하려고 하는데 너무 힘들어서 여러분에 게 자동으로 채점을 하는 프로그램을 부탁했습니다. 여러분이 선생님을 도와주세요.

 

입력 : 

3

10 55 

20 350

100 5050

 

출력예제:

YES          //1부터 10까지의 합이 55가 맞기에 YES 출력

NO

YES

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>

int main() {

	int N, num = 0, ans = 0;
	int res[10];
	scanf("%d", &N);

	for (int i = 1; i <= N; i++) {
		scanf("%d %d", &num, &ans);
		int sum = 0;

		for (int j = 1; j <= num; j++) {
			sum = sum + j;
		}

		if (sum == ans) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}