코드업 C언어 기초 100제 - [기초-입출력]

6720·2022년 8월 3일
0

CodingTest(코드업)

목록 보기
3/13
post-thumbnail

👨‍🏫 이번 목표

코드업 C언어 기초 100제에서 [기초-입출력] 풀기

📒 문제 풀이

1010번

정수형(int)으로 변수를 선언하고, 변수에 정수값을 저장한 후 변수에 저장되어 있는 값을 그대로 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a = 10;
    printf(a);
    return 0;
}
  • 정답 여부: X -> scanf 활용 안해서 컴파일 오류남.

  • 해설: 1) 변수 선언, 2) 변수에 정수값을 저장, 3) 그대로 출력

너무 오랜만에 C 하니깐 문법 다 틀리네 ㅋㅋ..

문제를 그대로 이해하고 풀어야 한다. 변수에 정수값을 저장한다는 뜻은 선언할 때 초기화를 한다는 뜻이 아닌 scanf를 사용하라는 뜻이다.

그리고 문법은 이렇게 사용했었다.
scanf -> scanf("%d", &a);
printf -> printf("%d", a);

그러므로 아래와 같이 작성하면 될 것이다.

#include <stdio.h>

int main() {
    int a;
    scanf("%d", &a);
    printf("%d", a);
    return 0;
}

어휴


1011번

문자형(char)으로 변수를 하나 선언하고, 변수에 문자를 저장한 후 변수에 저장되어 있는 문자를 그대로 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a;
    scanf("%c", &a);
    printf("%c", a);
    return 0;
}
  • 정답 여부: O


1012번

실수형(float)로 변수를 선언하고 그 변수에 실수값을 저장한 후 저장되어 있는 실수값을 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    float a;
    scanf("%f", &a);
    printf("%f", a);
    return 0;
}
  • 정답 여부: O


1013번

정수(int) 2개를 입력받아 그대로 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d %d", a, b);
    return 0;
}
  • 정답 여부: O


1014번

2개의 문자(ASCII CODE)를 입력받아서 순서를 바꿔 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    char a, b;
    scanf("%c %c", &a, &b);
    printf("%c %c", a, b);
    return 0;
}
  • 정답 여부: X -> 순서를 안바꿨어..

  • 해설: printf 부분만 조금 바꿔주면 될 것 같다.

#include <stdio.h>

int main() {
    char a, b;
    scanf("%c %c", &a, &b);
    printf("%c %c", b, a);
    return 0;
}

진짜 문제 좀 잘 읽어야겠다.


1015번

실수(float) 1개를 입력받아 저장한 후, 저장되어 있는 값을 소수점 셋 째 자리에서 반올림하여 소수점 이하 둘 째 자리까지 출력하시오.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    float a, b;
    scanf("%f %f", &a, &b);
    printf("%3f %3f", a, b);
    return 0;
}
  • 정답 여부: X -> 반올림이 그건줄 몰랐어..

  • 해설: 예를 들어서 소수점 이하 셋 째 자리까지 출력하라고 하면 %.3f로 입력해주면 된다. 이렇게 되면 소수점 이하 넷 째 자리에서 반올림한다.

이번 문제는 소수점 셋 째 자리에서 반올림해야하기 때문에 아래처럼 작성하면 된다.

그리고 이번에는 변수 1개를 입력받아야 하므로 b는 없애주면 된다.

#include <stdio.h>

int main() {
    float a;
    scanf("%f", &a);
    printf("%.2f", a);
    return 0;
}



1017번

int형 정수 1개를 입력받아 공백을 사이에 두고 3번 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a;
    scanf("%d", &a);
    printf("%d %d %d", a, a, a);
    return 0;
}
  • 정답 여부: O


1018번

어떤 형식에 맞추어 시간이 입력될 때, 그대로 출력하는 연습을 해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d:%d", &a, &b);
    printf("%d:%d", a, b);
    return 0;
}
  • 정답 여부: O


1019번

년, 월, 일을 입력받아 지정된 형식으로 출력하는 연습을 해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d-%d-%d", &a, &b, &c);
    printf("%d-%d-%d", a, b, c);
    return 0;
}
  • 정답 여부: X -> 출력이 이상하게 나온다.

  • 해설: 우선 코드업의 특성상 출력결과가 맞아야 하기 때문에 -은 .으로 바꿔줘야 한다.

그리고 8과 5를 입력했을 때 08과 05가 출력되야 한다. 이런 경우는 %02d를 사용해야 한다. 2칸을 사용해 출력하는 대신 한 자리 수인 경우는 앞에 0이 붙도록 해준다.
거기에 년도도 무조건 4자리가 나오도록 해줘야 한다.
밑처럼 작성하면 잘 작동할 것이다.

#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d.%d.%d", &a, &b, &c);
    printf("%04d.%02d.%02d", a, b, c);
    return 0;
}



1020번

주민번호를 입력받아 형태를 바꿔 출력해보자.

주민번호는 다음과 같이 구성된다.

XXXXXX-XXXXXXX

앞의 6자리는 생년월일(yymmdd)이고 뒤 7자리는 성별, 지역, 오류검출코드이다.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d-%d", &a, &b);
    printf("%d%d", a, b);
    return 0;
}
  • 정답 여부: X -> 출력이 이상하게 나온다.

  • 해설: 앞에 0이 출력이 안되는 부분만 해결해주면 된다.

문제에서 앞의 6자리는 생년월일이라고 얘기한 점, 전 문제에서 빈 자리 수를 특정 문자로 채워 넣는 점을 합쳐 문제를 해결하면 된다.

#include <stdio.h>

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



1021번

1개의 단어를 입력받아 그대로 출력해보자.

단어의 길이는 50자 이하이다.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    char a;
    scanf("%c", &a);
    printf("%c", a);
    return 0;
}
  • 정답 여부: X -> 첫 번째 문자만 저장됨.

  • 해설: char은 배열처럼 저장된다고 생각하면 된다.

char에 대한 설명을 읽어본 결과, char로 선언한 '변수'로는 문자만 저장할 수 있는 듯하고 포인터를 사용하여 문자열을 저장할 수 있는 듯하다. 포인터를 사용하지 않아도 문자열을 저장하는 방법은 배열을 char로 선언하는 것이라고 한다.
그리고 문자열은 %s를 사용하므로 주의해야 한다.

배열을 이용하면 이렇게 작성할 수 있다.

#include <stdio.h>

int main() {
    char a[50];
    scanf("%s", &a);
    printf("%s", a);
    return 0;
}



1022번

공백 문자가 포함되어 있는 문장을 입력받고 그대로 출력하는 연습을 해보자.

공백이 포함되어 있는 한 문장이 입력되며, 입력되는 문장은 여러 개의 단어로 구성되고, 엔터로 끝나며, 최대 길이는 2000 문자를 넘지 않는다.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    char a[2001];
    scanf("%s", &a);
    printf("%s", a);
    return 0;
}
  • 정답 여부: X -> 첫 번째 단어만 저장됨.

  • 해설: scanf를 사용하면 첫 번째 단어만 저장이 되므로 fgets를 사용해야 한다.

fgets -> fgets(배열이름, 크기, 파일포인터)
배열이름의 경우는 char로 선언한 배열을 의미하며, 크기는 배열에 저장될 커트라인이다.
만약 크기를 60으로 설정했을 때 문자가 59개를 넘어가면 작업을 중단하고 작업했던 부분까지만 저장한다. 거기에 fgets은 한 줄 단위로 문자열을 읽어들이는데 한 줄이 너무 길어 설정했던 부분을 넘어서면 한 줄을 다 못 읽고 중단할 수도 있다고 한다.

#include <stdio.h>

int main() {
    char a[2001];
    fgets(a, 2000, stdin);
    printf("%s", a);
    return 0;
}

+) stdin: standard input - 표준 입력에 대한 포인터(키보드 입력)

아 너무 어렵다..


1023번

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

여러 가지 방법들로 해결할 수 있다.
입력값은 절댓값이 10000을 넘지 않으며, 소수점 이하 자릿수는 최대 6자리까지이고 0이 아닌 숫자로 시작한다.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d.%d", &a, &b);
    printf("%d %d", a, b);
    return 0;
}
  • 정답 여부: O


1024번

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

단어의 길이는 20자 이하이다.
단어의 문자(영어)를 하나씩 나누어 한 줄에 한 개씩 ' '로 묶어서 출력한다.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    char a[21];
    scanf("%s", &a);
    for (int i=0; i<21; i++) {
    	printf("\'%c\'\n", a[i]);
    }
    return 0;
}
  • 정답 여부: X -> 마지막에 빈 공간이 출력됨.

  • 해설: for 문에서 조건을 바꿀 필요가 있다.

char 배열에 문자를 저장할 때 문자 끝에 Null이 같이 저장된다. 이 Null은 자리 한 칸을 차지하므로 저장할 때는 저장공간을 꼭 생각하면서 작업해야 한다.

지금 빈 공간이 같이 출력되는 이유가 Null때문이므로 for 문에서 이 부분을 판별할 수 있는 조건이 필요하다. Null을 문자로 표현하면 \0이므로 만약 a[i]\0이라면 for 문에서 나오도록 해야하기 때문에 i<21a[i]!='\0'로 바꿔줘야 한다.

#include <stdio.h>

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



1025번

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

각 자리의 숫자를 분리해 한 줄에 하나씩 [ ]속에 넣어 출력한다.
예를 들어 12345를 출력한다고 하면,
[10000]
[2000]
[300]
[40]
[5] 형식으로 출력해야 한다.

  • 내가 쓴 답
#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]", e);
    return 0;
}
  • 정답 여부: O


1026번

입력되는 시:분:초 에서 분만 출력해보자.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d:%d:%d", &a, &b, &c);
    printf("%d", b);
    return 0;
}
  • 정답 여부: O


1027번

년월일(yyyy.mm.dd)를 입력받아, 일월년(dd-mm-yyyy)로 출력해보자.

단, 한 자리 일/월은 0을 붙여 두자리로, 년도도 0을 붙여 네자리로 출력한다.

  • 내가 쓴 답
#include <stdio.h>

int main() {
    int a, b, c;
    scanf("%d.%d.%d", &a, &b, &c);
    printf("%02d-%02d-%04d", c, b, a);
    return 0;
}
  • 정답 여부: O


✨ 후기

1) 보니깐 1009번이랑 1016번이 없다. ㅇ0ㅇ 아무래도 중간중간에 빠진게 있는거 같다.

2) 생각보다 깊게 알고있지 않으면 어려운 문제들이 많은 것 같다. 그냥 시작하게 된 코테지만 하기 잘한 것 같다.

profile
뭐라도 하자

0개의 댓글