1번 1023 : [기초-입출력] 실수 1개 입력받아 부분별로 출력하기
입력
실수 1개가 입력된다.
(단, 입력값은 절댓값이 10000을 넘지 않으며, 소수점 이하 자릿수는 최대 6자리까지이고
0이 아닌 숫자로 시작한다.)
입력 예시
1.414213
출력
첫 번째 줄에 정수 부분을, 두 번째 줄에 실수 부분을 출력한다.
출력 예시
1
414213
풀이
1차 풀이
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int a;
int b;
scanf("%d.%d", &a,&b);
printf("%d\n%d",a,b);
return 0;
}
|
cs |
입력시 "."으로 구분하여 정수부와 소수부를 구분합니다.
2차 풀이
실수 하나만 바당 정수부와 소수부로 나눌 수 있을지 않을까란 생각이 들었습니다.
strtok 함수로 "."을 구분자로 하여 문자열을 자를 수 있었습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char *a = malloc(sizeof(char)*12);
scanf("%s", a);
char* split_a = strtok(a, ".");
while (split_a != NULL) {
printf("%s\n", split_a);
split_a = strtok(NULL, ".");
}
free(a);
return 0;
}
|
cs |
char * strtok(char * _String, char const *_Delimiter);
C언어서 문자열을 분리해주는 함수.(strtok = string tokenize)
두 번째 인자인 구분자를 싱글쿼터('')가 아닌 더블쿼터("")로 묶어주어야 합니다.
파이썬의 split과 달리 한 번에 구분자로 자를 수 없기 때문에 while문을 사용하여 문자열을 자릅니다.
NULL을 넣었을 때는 직전 strtok 함수에서 처리했던 문자열에서 잘린 문자열만큼 다음 문자로 이동한 뒤 다음 문자열을 자릅니다.
잘린 부분을 NULL로 바꾼 뒤 잘린 문자열의 포인터를 반환합니다.
즉, strtok 함수를 사용할 때는 처음에만 자를 문자열을 넣어주고, 그 다음부터는 NULL을 넣어줍니다.
이때 strtok 함수가 어떻게 구분자 이후의 주소를 알고 있는지 궁금하였는데 해당 값이 지역변수가 아니라 정적변수라면 가능하게 된다고 합니다.
2번 1025 : [기초-입출력] 정수 1개 입력받아 나누어 출력하기
입력
다섯 자리로 이루어진 1개의 정수를 입력받는다.
(단, 10,000 <= 입력받는 수<=99,999)
입력 예시
75254
출력
각 자리의 숫자를 분리해 한 줄에 하나씩 []속에 넣어 출력한다.
출력 예시
[70000]
[5000]
[200]
[50]
[4]
풀이
1차 풀이
아래와 같이 각 자리수 별로 변수를 만들어 저장하여 10,000부터 1까지 곱해서 출력합니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a,b,c,d,e;
scanf("%1d%1d%1d%1d%1d",&a, &b, &c, &d, &e);
printf("[%d]\n", a * 10000);
printf("[%d]\n", b * 1000);
printf("[%d]\n", c * 100);
printf("[%d]\n", d * 10);
printf("[%d]\n", e * 1);
return 0;
}
|
cs |
2차 풀이
입력 받는 정수는 5자리로 고정되어 있습니다.
그렇기 때문에 10,000으로 나누면 첫 번째 자리가 나오고 10,000을 곱해줍니다.
해당 값을 원래 값에서 빼주면 4자리 값이 나옵니다.
위 과정을 반복 해주면 문제를 해결할 수 있습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int a;
int b = 10000;
scanf("%d", &a);
while (b > 0) {
printf("[%d]\n", (a / b) * b);
a -= (a / b) * b;
b /= 10;
}
return 0;
}
|
cs |
3번 1028 : [기초-데이터형] 정수 1개 입력받아 그대로 출력하기2
입력
정수 1개가 입력된다.
(단, 입력되는 정수의 범위는 0 ~ 4,294,967,295 이다.)
입력 예시
2147483648
출력
입력된 정수를 그대로 출력한다.
출력 예시
2147483648
풀이
|
1
2
3
4
5
6
7
8
9
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
unsigned int n;
scanf("%u", &n);
printf("%u", n);
return 0;
}
|
cs |
이번 문제를 통해 int의 범위는 "-2,147,483,648 ~ +2,147,483,647", unsigned int의 범위는 " 0 ~ 4,294,967,295 "인 것을 다시 한번 알 수 있었습니다.
4번 1029 : [기초-데이터형] 실수 1개 입력받아 그대로 출력하기2
입력
소수점 아래 숫자가 11개 이하인 실수 1개가 입력된다.
(단, 입력되는 실수의 범위는 +- 1.7*10^-308 ~ +- 1.7*10^308 이다.)
입력 예시
3.14159265359
출력
입력된 실수를 소수점 이하 11자리까지 반올림하여 출력한다.
참고
%.11lf 를 사용하면 소수점 이하 11자리까지 출력된다.
출력 예시
3.14159265359
풀이
|
1
2
3
4
5
6
7
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
double d;
scanf("%lf", &d);
printf("%.11lf", d);
}
|
cs |
이번 문제를 통해 float 데이터형의 범위가 "+-3.4*10^-38 ~ +-3.4*10^38", double 데이터형의 범위가 "+- 1.7*10^-308 ~ +- 1.7*10^308"인 것을 다시 한번 알 수 있었습니다.
5번 1030 : [기초-데이터형] 정수 1개 입력받아 그대로 출력하기3
입력
정수 1개가 입력된다.
단, 입력되는 정수의 범위는 -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 이다.
입력 예시
-2147483649
출력
입력된 정수를 그대로 출력한다.
출력 예시
-2147483649
풀이
|
1
2
3
4
5
6
7
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
long long int n;
scanf("%lld", &n);
printf("%lld", n);
}
|
cs |
int에도 long long int 데이터형이 존재한다는 사실을 이때까지 모르고 있었습니다. 또한 해당 데이터 타입이 표현할 수 있는 수의 범위가 "-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807"인 것을 알게 된 문제였습니다.
참고
https://dojang.io/mod/page/view.php?id=376
C 언어 코딩 도장: 45.1 문자를 기준으로 문자열 자르기
45 문자열 자르기 지금까지 문자열을 복사하거나 붙이는 방법을 알아보았습니다. 이번에는 주어진 문자열을 자르는 방법을 알아보겠습니다. 참고로 문자열 자르기는 포인터를 이용하는 방식이
dojang.io
https://reakwon.tistory.com/64
[C언어] 문자열 함수2 그림으로 쉽게 보는 strtok, strstr 원리와 사용법, 예제
C언어 문자열 함수 문자열을 다룰때 어떤 문자열 단위로 자르고 싶은 경우나 어떤 문자열에서 임의의 문자열을 찾고 싶은 경우가 있지 않았나요? 그 경우에 사용할 수 있는 문자열 함수를 소개
reakwon.tistory.com
'[P4C 4기] > 과제' 카테고리의 다른 글
| [P4C 4기] 7주차 과제 올드 스쿨 (Buffer Overflow, Format String Bug, RET overwrite, memory write primitive) (0) | 2022.06.03 |
|---|---|
| [P4C 4기] 6주차 과제 - Doubly Linked List 구현, 구구단 with 어셈블리어, Stack 문서 요약 (0) | 2022.05.29 |
| [P4C 4기] 4~5주차 - 과제C언어로 HTTP 서버 구현 (0) | 2022.05.17 |
| [P4C 4기] 3주차 과제 - 코드업 기초 100제 (~100) (0) | 2022.05.03 |
| [P4C 4기] 2주차 과제 - 코드업 기초 100제 (~70) (0) | 2022.04.20 |