본문 바로가기
C

[C]백준 03.for문, 04.while문(2739, 10950, 8393, 15552, 2741, 2742, 11021, 11022, 2438, 2439, 10871/ 10952, 10951, 1110)

by 열지희공 2022. 1. 6.

백준 2739

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < 9; i++) {
		printf("%d * %d = %d\n", n, i + 1, n * (i + 1));
	}
	return 0;
}

 

백준 10950

내코드

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

int main() {
	int t;
	scanf("%d", &t);
	int** arr = malloc(sizeof(int*) * t);
	for (int i = 0; i < t; i++) {
		arr[i] = malloc(sizeof(int) * 2);
	}
	for (int i = 0; i < t; i++) {
		scanf("%d %d", &arr[i][0], &arr[i][1]);
	}
	for (int i = 0; i < t; i++) {
		printf("%d\n", arr[i][0] + arr[i][1]);
	}
	for (int i = 0; i < 2; i++) {
		free(arr[i]);
	}
	free(arr);
	return 0;
}

테스트 케이스의 개수가 가변적이기 때문에 나는 2차원배열에 메모리를 동적할당하여 테스트 케이스를 저장했다. 

  • 자료형 **포인터이름 = malloc(sizeof(자료형 *) * 세로크기);와 같이 세로 공간 메모리 할당
  • 반복문으로 반복하면서 포인터[i] = malloc(sizeof(자료형) * 가로크기);와 같이 가로 공간 메모리 할당
  • 반복문으로 반복하면서 free(포인터[i]);와 같이 가로 공간 메모리 해제
  • free(포인터);와 같이 세로 공간 메모리 해제

이런 식으로 사용하면 된다. 

<출처: https://dojang.io/mod/page/view.php?id=319 >

 

백준 8393

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += i + 1;
	}
	printf("%d", sum);
	return 0;
}

 

백준 15552

내코드

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

int main() {
	int t;
	scanf("%d", &t);
	int** arr = malloc(sizeof(int*) * t);
	for (int i = 0; i < t; i++) {
		arr[i] = malloc(sizeof(int) * 2);
	}
	for (int i = 0; i < t; i++) {
		scanf("%d %d", &arr[i][0], &arr[i][1]);
	}
	for (int i = 0; i < t; i++) {
		printf("%d\n", arr[i][0] + arr[i][1]);
	}
	for (int i = 0; i < 2; i++) {
		free(arr[i]);
	}
	free(arr);
	return 0;
}

 

백준 2741

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		printf("%d\n", i + 1);
	}

	return 0;
}

 

백준 2742

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = n; i > 0; i--) {
		printf("%d\n", i);
	}

	return 0;
}

 

백준 11021

내코드

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

int main() {
	int t;
	scanf("%d", &t);
	int** arr = malloc(sizeof(int*) * t);
	for (int i = 0; i < t; i++) {
		arr[i] = malloc(sizeof(int) * 2);
	}
	for (int i = 0; i < t; i++) {
		scanf("%d %d", &arr[i][0], &arr[i][1]);
	}
	for (int i = 0; i < t; i++) {
		printf("Case #%d: %d\n", i + 1, arr[i][0] + arr[i][1]);
	}
	for (int i = 0; i < t; i++) {
		free(arr[i]);
	}
	free(arr);
	return 0;
}

 

백준 11022

내코드

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

int main() {
	int t;
	scanf("%d", &t);
	int** arr = malloc(sizeof(int*) * t);
	for (int i = 0; i < t; i++) {
		arr[i] = malloc(sizeof(int) * 2);
	}
	for (int i = 0; i < t; i++) {
		scanf("%d %d", &arr[i][0], &arr[i][1]);
	}
	for (int i = 0; i < t; i++) {
		printf("Case #%d: %d + %d = %d\n", i + 1, arr[i][0], arr[i][1], arr[i][0] + arr[i][1]);
	}
	for (int i = 0; i < t; i++) {
		free(arr[i]);
	}
	free(arr);
	return 0;
}

 

백준 2438

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < i + 1; j++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

 

백준 2439

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		for (int j = n - (i + 1); j > 0; j--) {
			printf(" ");
		}
		for (int j = 0; j < i + 1; j++) {
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

 

백준 10871

내코드

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

int main() {
	int n, x;
	scanf("%d %d", &n, &x);
	int* arr = malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	for (int i = 0; i < n; i++) {
		if (arr[i] < x) {
			printf("%d ", arr[i]);
		}
	}

	return 0;
}

 

백준 10952

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int a, b;
	int arr[100] = { 0, };
	int cnt1 = 0;
	int cnt2 = 0;
	while (1) {
		scanf("%d %d", &a, &b);
		if (a == 0 && b == 0) {
			break;
		}
		arr[cnt1] = a + b;
		cnt1++;
	}
	while (1) {
		if (arr[cnt2] == 0) {
			break;
		}
		printf("%d\n", arr[cnt2]);
		cnt2++;
	}

	return 0;
}

처음엔 입력 후 한꺼번에 출력해야하는줄 알고 위의 코드로 제출했는데 굳이 한꺼번에 출력하지 않고 한 테스트케이스마다 출력해도 가능한 것 같다. 아래의 코드는 테스트케이스마다 출력하는 코드이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int a, b;
	
	while (1) {
		scanf("%d %d", &a, &b);
		if (a == 0 && b == 0) {
			break;
		}
		printf("%d\n", a + b);
	}
	
	return 0;
}

 

백준 10951

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int a, b;
	while (scanf("%d %d",&a,&b)!=EOF) {
		printf("%d\n", a + b);
	}
	return 0;
}

처음에는 조건이 부실하다고 생각하고 그냥 while(1)로 돌렸더니 출력초과 결과가 떴다. 그래서 이 문제를 구글링해봤더니 EOF를 사용해야 한다고 했다. 그래서 EOF에 대해 찾아봤다.

EOF란 End of File의 줄임말이다. c언어에서는 파일의 끝에 도달했을 때 언제나 특별한 값을 반환하도록 한다. 그 값을 EOF라고 하고, 이 값은 -1이다. 

<출처: http://www.tcpschool.com/c/c_string_io >

scanf는 입력에 성공한 값을 리턴하기 때문에 이 값이 입력이 끝나는 EOF, 즉 -1이 아닐 때까지 반복하라는 while(scanf("%d %d", &a, &b)!=EOF) 코드로 고쳐서 제출했더니 성공했다. 

 

백준 1110

내코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	int copy = n;
	int x, y;
	int cnt = 0;
	do{
		x = n % 10;
		y = (n / 10) + x;
		n = (10 * x) + (y % 10);
		cnt++;
	} while (n != copy);
	printf("%d", cnt);
	return 0;
}