(class 2)

- 1차 코드

#include<stdio.h>
int main()
{
	int start, end, i, j;
	
	scanf("%d %d", &start, &end);
	for (i = start; i <= end; i++) {
		int prime = 1;
		for (j = 2; j < i; j++) {
			if (i % j == 0) {
				prime = 0;
			}
		}
		if (prime == 1) {
			printf("%d\n", i);
		}
	}

}

실패 원인 : 시간 초과

  1차 코드는 실행은 잘 되었지만 시간 초과로 실패하였다. 따라서 코드의 효율성을 따질 필요가 있었다.

검색해본 결과, '에라토스테네스의 체' 방식을 사용해야 함을 알게되었다.

 

- 성공 코드

#include<stdio.h>
int arr[1000001];
int main()
{
	int start, end, i, j;

	scanf("%d %d", &start, &end);

	arr[0] = arr[1] = 1;

	for (i = 2; i <= end; i++) {
		for (j = 2 * i; j <= end; j += i) {
			if (arr[j] == 0) arr[j] = 1;
		}
	}

	for (i = start; i <= end; i++) {
		if (arr[i] == 0) printf("%d\n", i);
	}
	return 0;
}

<코드 설명>

  배열 arr을 만들어 소수이면 0, 아니면 1을 저장하도록 하였다. 입력값인 시작값(start)과 끝값(end)를 먼저 입력받았다.

i를 2부터 end까지 for문을 돌려주고 그 안에서 i의배수에 해당하는 것들을 차근히 지워나가주게 된다. 이처럼 원소 값이 1이 된 것들을 제외하고 나머지를 출력해준다.

 

<실행 결과>

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 10845 큐  (0) 2022.04.28
[BoJ] 4673 셀프 넘버  (0) 2022.04.03
[BOJ] 10828 스택  (0) 2022.04.02
[SISS] C 백준 8주차 (11720, 1085, 10250)  (0) 2022.02.14
[SISS] C 백준 7주차 (10809, 10818, 10871)  (0) 2022.02.08

(class 2)

#include<stdio.h>
#include<string.h>

int arr[10000];
int i = 0;

void push(int n) {
	arr[i] = n;
	i++;
}

void pop() {
	if (i != 0) {
		i--;
		printf("%d\n", arr[i]);
		arr[i] = 0;
	}
	else {
		printf("-1\n");
	}
}

void size() {
	printf("%d\n", i);
}

void empty() {
	if (i != 0) {
		printf("0\n");
	}
	else {
		printf("1\n");
	}
}

void top() {
	if (i != 0) {
		printf("%d\n", arr[i - 1]);
	}
	else {
		printf("-1\n");
	}
}

int main()
{
	int num, j;
	char word[10];
	scanf("%d", &num);
	for (j = 0; j < num; j++) {
		scanf("%s", &word);

		if (!strcmp(word, "push")) {
			int data;
			scanf("%d\n", &data);
			push(data);
		}
		else if (!strcmp(word, "pop")) {
			pop();
		}
		else if (!strcmp(word, "size")) {
			size();
		}
		else if (!strcmp(word, "empty")) {
			empty();
		}
		else if (!strcmp(word, "top")) {
			top();
		}
	}
	return 0;
}

<코드 설명>

전역변수로 배열 arr와 인덱스인 i를 선언해주었다.

 

- push 함수 : arr[i]에 함수 인자값을 넣어주고 인덱스인 i를 1 증가시켜준다.

- pop 함수 : 인덱스가 0이 아닐 경우, i를 1 감소시켜주고 arr[i]를 출력시키며 해당 값을 0으로 만들어준다. 인덱스가 0일경우에는 -1을 출력시켜준다.

- size 함수 : 인덱스인 i를 출력시킨다.

- empty 함수 : 인덱스가 0이 아닐 경우, 0을 출력시켜준다. 인덱스가 0일 경우에는 1을 출력시켜준다.

- top 함수 : 인덱스가 0이 아닐 경우, arr[i-1]을 출력시켜준다. 인덱스가 0일 경우 -1을 출력시켜준다.

 

  수행시킬 명령문의 개수인 num을 입력받고 그만큼 for문을 통해 반복시켜주었다. for문 내에서 수행할 명령인 word를 입력받았으며, strcmp함수로 word와 각 수행문의 문자가 동일한지 확인해준 후, 동일할 경우 해당 함수를 실행시켜주었다.

 

 

<실행 결과>

 

No. 11720

#include<stdio.h>
int main()
{
	int n, i, sum = 0;
	scanf("%d", &n);
	char number[100];
	scanf("%s", number);
	for (i = 0; i < n; i++) {
		sum += number[i] - '0';
	}
	printf("%d", sum);
	
}

<코드 설명>

  먼저 입력받을 숫자의 개수인 n을 입력받는다. 그리고 배열 number을 입력받는다. 입력받은 수의 개수인 n만큼을 for문을 통해 반복시켜 그 안에서 sum값을 구한다. sum에는 number의 원소들을 계속 더해주는데 처음 입력받을 때 char형으로 입력받았기 때문에 숫자로 변환시켜주기 위해 '0'을 빼줘야한다. 이 과정을 거쳐 구해진 sum을 출력해준다.

 

<실행 결과>

 

No. 1085

#include<stdio.h>
int main()
{
	int x, y, w, h, min;
	scanf("%d %d %d %d", &x, &y, &w, &h);
	min = x;
	if (min > y) min = y;
	if (min > w - x) min = w - x;
	if (min > h - y) min = h - y;
	printf("%d", min);
	return 0;
}

<코드 설명>

 x, y, w, h를 입력 받고 일단 min을 x로 설정한다. 이는 다른 값과 계속 비교하면서 min을 갱신하기 위함이다. 경계에 도착하는 최소 길이이기 때문에 x, y, w-x, h-y 중 가장 작은 값이 답이 된다. 따라서 min값과 나머지 y, w-x, h-y를 비교해주며 가장 작은 값을 찾아 min에 넣어주었다. 그리고 이를 출력해주었다.

 

<실행 결과>

 

No. 10250

#include<stdio.h>
int main()
{
	int t, h, w, n, i, cnt;
	scanf("%d", &t);
	for (i = 0; i < t; i++) {
		cnt = 1;
		scanf("%d %d %d", &h, &w, &n);
		while (n > h) {
			n = n - h;
			cnt++;
		}
		printf("%d%02d\n", n, cnt);
	}
	return 0;
}

<코드 설명>

 test case인 t를 입력받고 그만큼 for문을 이용해 반복시킨다. 그 내에서 h, w, n을 각 각 입력받는다. 방 배정이 1층부터 위쪽으로 채워지므로 n에서 h를 빼주며 몇번 빠졌는지를 cnt에 저장해주었다. 이는 몇호인지 체크하기 위함이다. n에서 계속 건물의 높이인 h를 빼주면 마지막에 남은 n값이 몇층인지를 결정해준다.

  따라서 n과 cnt를 붙여 출력해주었다. 이때 cnt는 %02d로 출력해주어 무조건 두자리로 출력되도록 하였다.

 

<실행 결과>

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1929 소수 구하기  (0) 2022.04.02
[BOJ] 10828 스택  (0) 2022.04.02
[SISS] C 백준 7주차 (10809, 10818, 10871)  (0) 2022.02.08
[SISS] C 백준 6주차 (2908, 2920, 3052)  (0) 2022.02.01
[SISS] C 백준 5주차 (2742, 2753, 2884)  (0) 2022.01.30

No. 10809

#include<stdio.h>
#include<string.h>
int main()
{
	int cnt[27], i, j;
	char s[101];
	scanf("%s", s);
	for (i = 0; i < 26; i++) {
		cnt[i] = -1;
	}
	for (i = 'a'; i <= 'z'; i++) {
		for (j = 0; j < strlen(s); j++) {
			if (s[j] == i) {
				cnt[s[j] - 'a'] = j;
				break;
			}
		}
	}
	for (i = 0; i < 26; i++) {
		printf("%d ", cnt[i]);
	}
}

<코드 설명>

  먼저 s를 입력받은 후 일단 cnt배열에 모든 원소를 -1로 저장해 놓는다. 이중 for문을 이용해 a부터 z까지 값과 s의 원소가 동일한지를 비교해주었다. 동일하다면 cnt배열에 순서값인 j를 넣어준다. 이때 s[j]-'a'번째 원소에 넣어주는 이유는 알파벳 a에 해당하는 값이 97이므로 이 값을 빼주어야 내가 원하는 위치에 해당 값을 넣어줄 수 있다. 

  이렇게 완성된 cnt배열을 출력해주어 원하는 값을 얻을 수 있었다.

 

<실행 결과>

 

No. 10818

#include<stdio.h>
int main()
{
	int n, i, max=-9999999,min=999999999,num;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &num);
		if (max < num) max = num;
		if (min > num) min = num;
	}
	printf("%d %d", min, max);
	return 0;
}

<코드 설명>

  입력할 숫자의 개수인 n을 입력 받고 그만큼을 for문을 이용해 입력받는다. 그리고 max와 min을 각각 아주 작은, 아주 큰 수로 지정해 놓았다.

  for문 내에서 max가 입력받은 num보다 작으면 그 수를 max에 저장해준다. 그리고 min이 입력받은 num보다 크면 그 수를 min에 저장해준다.

  이러한 방식으로 모든 수를 확인해주고 최종적으로 max와 min에 저장된 수를 출력해주었다.

 

<실행 결과>

 

No. 10871

#include<stdio.h>
int main()
{
	int n, x, i, num;
	scanf("%d %d", &n, &x);
	for (i = 0; i < n; i++) {
		scanf("%d", &num);
		if (num < x) printf("%d ", num);
	}
}

<코드 설명>

  첫 줄에 입력할 수열의 개수인 n과 정수 x를 입력받는다. 그리고 n만큼 입력받기 위해 for문을 이용해 주었다. num들을 입력 받을 때마다 x보다 작은 지 확인해주고 작다면 이를 출력해주었다.

 

<실행 결과>

+ Recent posts