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 *= 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

 

 

+ Recent posts