Fascination
article thumbnail

W1: 코드업 기초 100제 20번~30번대 문제들 중 가장 어려운 5문제 write-up 작성하기

코드업 기초100제 (22.04.18 ~ 22.04.24)


과제를 위해서 20-30번만 풀까 아니면 다 풀까 고민했는데

C는 기본중에 기본이고 거의 2년전에 배웠던 언어라서 다시 공부하고자하는 마음에 다 풀어보았다 ~.~

개인적으로 너무 쉬워서 시간낭비라고 생각할 수도 있지만

알고리즘 말고 C언어 사용 자체에 대한 개념적인 부분들 중 까먹은 것들을

다시 상기시킬 수 있어서 괜찮았다고 생각한다

 

# 1020 : [기초-입출력] 주민번호 입력받아 형태 바꿔 출력하기

[문제] 주민번호는 다음과 같이 구성된다.
XXXXXX-XXXXXXX
앞의 6자리는 생년월일(yymmdd)이고 뒤 7자리는 성별, 지역, 오류검출코드이다.
주민번호를 입력받아 형태를 바꿔 출력해보자.

 

[입력 예시]

000907-1121112

 

[출력 예시]

0009071121112

 

[풀이]

#include<stdio.h>

int main(){
    int x, y;
    scanf("%d-%d",&x,&y);
    printf("%06d%07d",x,y);
    return 0;
}

출력 포맷으로 %뒤에 06, 07을 주는 것에 대한 의미는 6자리, 7자리를 채워서 출력하는데

이때 자리가 비는 곳에 0을 출력한다는 의미임

처음 시도에서 문자열로 두번 입력 받으려고 시도했었는데 계속 틀려서 다시 생각해보니

문자열로 입력 받을 경우 -까지 입력되어 두 정수로 입력받고

가운데 구분자 '-'를 사용하는 방법을 사용해야 했음!

 

 

# 1023 : [기초-입출력] 실수 1개 입력받아 부분별로 출력하기

[문제] 실수 1개를 입력받아 정수 부분과 실수 부분으로 나누어 출력한다

* 이때 입력값은 절댓값이 10000을 넘지 않으며, 소수점 이하 자릿수는 최대 6자리까지이고 0이 아닌 숫자로 시작한다.

** 여러 가지 방법들로 해결할 수 있다.
만약 실수 부분이 0으로 시작하지 않는다면(예를 들어 1.000009)
scanf("%d.%d", &a, &b)도 하나의 방법이 될 수 있다.

 

[입력 예시]

1.414213

 

[출력 예시]

1 414213

 

[풀이 1]

#include<stdio.h>

int main(){
    int x,y;
    scanf("%d.%d",&x,&y);
    printf("%d\n%d",x,y);
    return 0;
}

주어진 힌트대로 풀었을 때의 풀이

 

[풀이 2]

#include<stdio.h>

int main(){
    char x[100];
    int i=0,j=0;
    scanf("%s",x);
    for(i=0;;i++){
        if(x[i]=='.') break;
        printf("%c",x[i]);
    }
    i++;
    printf("\n");
    for(j=i;x[j]!='\0';j++){
        printf("%c",x[j]);
    }
    return 0;
}

주어진 힌트는 소수점 이하 자리수가 0이 아닌 숫자로 시작한다는 조건에서만 사용 가능한 코드인 것 같아

일반화하여 사용할 수 있도록 다르게 작성해보았다!

두번째 풀이에서 char *x; 포인터로만 선언하면 에러가 계속나서 고민했는데

배열의 크기를 지정해주고 바로 해결되서 조금 당황했다 ㅎ,,

 

 

# 1024 : [기초-입출력] 단어 1개 입력받아 나누어 출력하기

[문제 설명] 단어를 1개 입력받는다. 입력받은 단어(영어)의 각 문자를 한줄에 한 문자씩 분리해 출력한다

 

[참고] C언어에서는 문장을 저장하기 위해 특별한 방법을 사용하지 않고,
배열이라는 연속된 공간에 문자들을 연속으로 한 개씩 저장하는 방법을 사용한다.
단, 문자열(문자가 연속적으로 연결된 줄이라는 의미. 즉 문장)의 마지막임을 나타내기 위해
문자열의 마지막에 널(NULL) 문자라는 특별한 의미를 가지는 문자를 삽입해 문장임을 나타낸다.
널(NULL)은 영어 단어 자체의 의미로는, 아무런 가치가 없는 또는 아무것도 없는, 사용되지 않은 등의 의미를 가지는데,
문자로는 '\0', 아스키문자의 정수값은 0을 의미하며 NULL 로도 사용할 수 있다.
단어나 문장을 scanf("%s", ...); 로 입력받게 되면, 그 마지막에 널문자가 자동으로 입력되는 것이다.
그러므로, 본 문제는 그렇게 저장되어있는 영문자들을 한 개씩 순차적으로 검사해서,
문장의 마지막을 나타내는 널문자가 나올 때까지 모양을 만들어 출력하면 되는 것이다.
나중에 조건실행문, 반복문, 배열에 대해서 배우면 명확히 이해할 수 있게 된다.
printf("%s", ...); 는 결국, 저장되어있는 문자의 마지막까지, 즉 널문자가 나올 때까지 형식에 맞추어 출력해 주라는 의미를 가진다.

 

[입력 예시]

Boy

 

[출력 예시]

'B'
'o'
'y'

 

[풀이]

#include<stdio.h>

int main(){

    char d[30];
    scanf("%s", d);
    for(int i=0; d[i]!='\0'; i++)
    {
        printf("\'%c\'\n", d[i]);
    }
return 0;
}

null값을 '\0'으로 표현하며 '\' 문자를 출력하기 위해서는 '(따옴표)를 앞에 붙여주어야 함

출력 시 주의할 점은 한 문자 출력 후 '\n'을 통해 줄바꿈을 해주어야 한다는 것

(다른 언어를 공부하다보니 코드 작성할 때, null을 '\0'으로 써야한다는 것을 다시 상기시켜준 문제였음 !)

 

 

# 1025 : [기초-입출력] 정수 1개 입력받아 나누어 출력하기

[문제] 다섯 자리의 정수 1개를 입력받아 각 자리별로 나누어 출력한다.

 

[참고] scanf("%1d%1d%1d%1d%1d", &a, &b, &c, &d, &e);를 사용하면 1개의 숫자로 각각 구분되어 저장된다.

printf("[%d]", a*10000);과 같은 방법도 가능하다.

 

[입력 예시]

75254

 

[출력 예시]

[70000]
[5000]
[200]
[50]
[4]

 

[풀이]

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

int main(){
    char n[6];
    scanf("%s",n);
    int a=10000;
    for(int i=0;i<5;i++){
        printf("[%ld]\n",(n[i]-'0')*a);
        a/=10;
    }
}

참고에서 준 두 번째 방법을 사용하였고 입력을 string형태로 받아 저장한 후

각 자리 값에서 '0'을 빼주어 정수 값으로 변환하여 자리별로 출력했음!

* 출력 형식에서 []를 빼먹어서 틀렸던 문제,, 문제만 읽지말고 예시 출력 값도 잘 확인하기

 

 

# 1029 : [기초-데이터형] 실수 1개 입력받아 그대로 출력하기 2

[문제] 실수 1개를 입력받아 그대로 출력해보자. (단, 입력되는 실수의 범위는 +- 1.7*10-308 ~ +- 1.7*10308 이다.)

 

[참고] float 데이터형을 사용하면 +- 3.4*10-38 ~ +- 3.4*1038 범위의 실수를 저장할 수 있다.
(float 로 선언하고 %f로 입력 받아 출력하면 된다.)
이 범위를 넘어가는(더 작거나 더 큰) 실수를 저장하기 위해서는
보다 큰 범위를 저장할 수 있는 다른 데이터형을 사용해야 정상적으로 저장시킬 수 있다.
double은 더 정확하게 저장할 수 있지만, float보다 2배의 저장 공간이 필요하다.
double 데이터형을 사용하면 +- 1.7*10-308 ~ +- 1.7*10308 범위의 실수를 저장할 수 있다.

[입력 예시]

3.14159265359

 

[출력 예시]

3.14159265359

 

[풀이]

#include<stdio.h>

int main(){
    double d;
    scanf("%lf", &d); // double(long float) 형식으로 입력
    printf("%.11lf", d);
}

출력 포맷 지정할 때 자릿수를 지정하려면 %뒤에 .[출력하고자하는 자릿수]를 추가적으로 입력하면 됨

double 형식의 실수를 입력받을 때 및 출력할 때의 포맷 형식은 "%ld"임

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!