1020 : [기초-입출력] 주민번호 입력받아 형태 바꿔 출력하기
답 :
#include <stdio.h>
int main(){
int a,b;
scanf("%06d-%07d", &a, &b);
printf("%06d%07d", a, b);
}
해설
위 문제는 printf의 형식 문자열에 따라 출력되는 형태가 다름을 이해할 수 있다.
scanf("%06d-%07d" 의 형식 문자열을 풀이해보면
0(필드너비 설정), 6만큼의 필드 너비를 지정한 후 10진수 정수를 입력받고 -(하이픈)으로 정수를 구분한다는 뜻이다.
0(필드 너비 설정), 7만큼의 필드 너비를 지정한 후 10진수 정수를 입력받는다.
예시 주민번호 - 190101-1234567)
scanf 입력을 받을 때 a변수에 190101를 입력하고 구분을위한 -(하이픈)을 입력한다. b변수에 뒷자리를 1234567입력한다.
printf 출력시 두 변수를 붙여서 출력하고 싶다면 출력 형식 문자열에 변수 a,b를 붙여주면 된다 ㅡ> "%d%d"
% : 형식 지정자를 시작하는 기호
d : 10진수 정수를 출력할 때 사용하는 형식지정자
1021 : [기초-입출력] 단어 1개 입력받아 그대로 출력하기
답 :
#include <stdio.h>
int main(){
char data[51]="";
scanf("%s",data);
printf("%s",data);
}
해설
위 문제는 문자 1개가 아닌 문자열, 단어를 출력하는 문제이다.
문자 1개를 출력할 때는
char을 사용하여 변수 생성,
형식 지정자 "%c"를 사용하여 입출력 이였을 때,
문자열, 단어의 경우
char을 사용하여 배열변수 data[51] 선언, ="" 으로 빈 문자열 초기화,
형식 지정자 "%s"를 사용하여 입출력을 하게 된다.
배열이란.
동일한 데이터 타입을 가진 여러 개의 변수를 하나의 이름으로 묶어서 관리하는 자료구조이다.
배열은 연속적인 메모리 공간에 저장되며, 각 요소는 인덱스를 사용하여 접근할 수 있다.
배열의 인덱스는 0부터 시작하며, 문자열의 경우 마지막의 null값을 가진다.
인덱스 예시)
int numbers[5] ㅡ> 배열 길이가 5인 int형 배열 선언
- numbers[0]
- numbers[1]
- numbers[2]
- numbers[3]
- numbers[4]
문자열 예시)
char str[6] = "hello" ㅡ> 배열 길이가 6인 문자열 배열 선언
- 'h'
- 'e'
- 'l'
- 'l'
- 'o'
- '\o'
마지막에는 항상 NULL (\o) 문자가 들어가야 하므로 5개의 문자열을 입력해도 널값이 들어갈 공간까지 +1해서 선언해줘야한다.
\o : 문자열의 끝을 나타내며, 문자열 함수들이 문자열의 끝을 알 수 있게 해주는 역할
1022 : [기초-입출력] 문장 1개 입력받아 그대로 출력하기
답 :
#include <stdio.h>
int main(){
char data[2001]="";
fgets(data, 2000, stdin);
printf("%s",data);
}
해설
위 문제는 문장을 출력하는 문제이다.
문장을 출력할 때는
char을 사용하여 배열변수 생성, 배열 초기화 ="" ,
fgets 함수를 이용하여 stdin(표준입력=키보드)로 문자열을 입력받는다.
fgets(변수,배열크기,stdin)
"%s" 형식 지정자로 문장을 출력한다.
문장은 함수가 문장의 끝을 알 수 있게 \o이 들어갈 공간까지 n+1 공간을 설정해준다.
2000개의 문자를 입력받고 싶을 때 2001의 배열 공간을 선언해야한다.
1023 : [기초-입출력] 실수 1개 입력받아 부분별로 출력하기
답 :
#include <stdio.h>
int main()
{
int a, b;
scanf("%d.%d", &a, &b);
printf("%d\n%d", a, b);
}
해설
위 문제는 .을 기준으로 앞, 뒤의 숫자를 출력하는 문제이다.
예시로 1.23을 1,23으로 출력하고싶다면
a 변수에 1을 담고, b 변수에 23을 담은 후 .으로 구분하여 입력받는다.
printf 함수로 "%d,%d",a,b를 출력하게 되면 1,23으로 출력된다.
문제에 맞게 줄바꿈으로 구분하고 싶으면 \n 이스케이프 문자를 사용하여 출력해주면 된다.
1024 : [기초-입출력] 단어 1개 입력받아 나누어 출력하기
답 :
#include <stdio.h>
int main()
{
char d[31];
scanf("%s", d);
for(int i=0; d[i]!='\0'; i++) {
printf("\'%c\'\n",d[i]);
}
}
해설
위 문제는 문자열을 for문을 통해 나누어 출력하는 문제이다.
단어 Boy를 입력받기 위해 배열변수 char 변수이름[배열길이]를 선언한다.
scanf 함수로 "%s" 변수 안에 'Boy'를 입력한다.
이제 배열 안에는 d[0]='B' , d[1]='o' , d[2]='y'... 가 지정되어 있는 상태이다.
for 문을 사용하여 배열의 인덱스 별 값을 출력하는 코드를 작성할 차례이다.
for은 초기값; 조건식; 증감식 구조를 가지고 있다.
초기값 : index를 나타낼 변수 i를 선언한 후 배열의 index는 0부터 시작하니 초기값을 0으로 설정해준다.
조건식 : 문자열의 끝을 나타내는 \o 을 만나면 배열이 종료되게 선언한다. != (비교연산자)는 같지않음을 나타낸다.
증감식 : 0부터 1씩 증가하며 배열의 인덱스를 가져올거기 때문에 i ++(증감연산자)을 입력한다.
for문의 순서는 초기값->조건식 ->참이면 함수실행 -> 증감식실행 ->조건식 ->참이면 함수 실행 ... 이다.
i= 0일때 d [0]은 'B'이기 때문에 '\o'과 같지 않다-> 함수를 실행한다.
d [0]=B를 가져온 후 이스케이프 문자 \' %c \' \n 이기 때문에 출력은 'B' 줄바꿈이 된다.
연산자
- 산술 연산자 (Arithmetic Operators):
- +: 덧셈
- -: 뺄셈
- *: 곱셈
- /: 나눗셈
- %: 나머지 연산 (모듈로 연산)
- 할당 연산자 (Assignment Operators):
- =: 변수에 값을 할당
- +=: 덧셈 후 할당
- -=: 뺄셈 후 할당
- *=: 곱셈 후 할당
- /=: 나눗셈 후 할당
- %=: 나머지 연산 후 할당
- 비교 연산자 (Comparison Operators):
- ==: 같음
- !=: 다름
- <: 작음
- >: 큼
- <=: 작거나 같음
- >=: 크거나 같음
- 논리 연산자 (Logical Operators):
- &&: 논리 AND (그리고)
- ||: 논리 OR (또는)
- !: 논리 NOT (부정)
- 증감 연산자 (Increment/Decrement Operators):
- ++: 변수를 1 증가
- --: 변수를 1 감소
- 비트 연산자 (Bitwise Operators):
- &: 비트 AND
- |: 비트 OR
- ^: 비트 XOR
- ~: 비트 NOT
- <<: 왼쪽 시프트
- >>: 오른쪽 시프트
- 조건(삼항) 연산자 (Conditional (Ternary) Operator):
- condition ? value_if_true : value_if_false: 조건식이 참이면 첫 번째 값, 거짓이면 두 번째 값 반환
- sizeof 연산자:
- sizeof(variable_type): 변수 또는 데이터 타입의 크기를 바이트 단위로 반환
- 형변환 연산자 (Type Casting Operator):
- (new_type) expression: 표현식을 다른 데이터 타입으로 변환
- 포인터 연산자 (Pointer Operators):
- &: 변수의 주소를 얻음
*: 포인터를 통해 변수를 간접적으로 조작
1025 : [기초-입출력] 정수 1개 입력받아 나누어 출력하기
답 :
#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);
}
해설
위 문제는 산술연산자를 사용하는 문제이다.
12345를 입력받았을 때
10000
2000
300
40
5
를 출력하려한다.
12345=10000*1+1000*2+100*3+10*4+1*5 로 풀이할 수 있다.
scanf 로 숫자 5개를 붙여서 입력받은 후 각 자리 숫자에 * 를 하면 되는 문제이다.
printf는 아래 구조로 입력해주면 된다.
printf(형식지정자,변수)
변수 위치에 원하는 연산자를 추가하여 값을 도출해낼 수 있다.
예시
a=1 ,b=2
printf("%d", a+b) ㅡ> 1 + 2 = 3
printf("%d", a-b) ㅡ> 1 - 2 = -1
printf("%d", a*b) ㅡ> 1 * 2 = 2
printf("%d", a/b) ㅡ> 1 / 2 = 0
printf("%d", a%b) ㅡ> 1 % 2 = 1
1026 : [기초-입출력] 시분초 입력받아 분만 출력하기
답 :
#include <stdio.h>
int main()
{
int h, m, s;
scanf("%d:%d:%d", &h, &m, &s);
printf("%d", m);
}
해설
위 문제는 여러 번수를 입력받아도 원하는 변수만 출력할 수 있다는 것을 이해할 수 있다.
scanf 함수로 3개의 변수에 :로 구분을 두어 값을 저장하였다.
printf 함수로 특정 한 변수만 출력해보인다.
1027 : [기초-입출력] 년월일 입력받아 형식 바꿔 출력하기
답 :
#include <stdio.h>
int main()
{
int y,m,d;
scanf("%d.%d.%d", &y, &m, &d);
printf("%02d-%02d-%04d", d,m,y);
}
해설
위 문제는 입력받은 변수를 원하는 형식으로 출력하는 방법을 익힐 수 있다.
printf 함수의 소스를 확인해보면 %02d-%02d-%04d의 형태 지정을 확인할 수 있다.
%02d 하나를 풀어보면 2개의 최소너비를 가진 후 값이 없으면 그부분은 0으로 채운 10진수의 정수를 출력한다. 의 의미를 가지고있다.
'C' 카테고리의 다른 글
[ Code Up (코드업) ] 기초100제 문제해설 1038~1046 [기초-산술연산] (0) | 2023.08.30 |
---|---|
[ Code Up (코드업) ] 기초100제 문제해설 1031~1037 [기초-출력변환] (0) | 2023.08.30 |
[ Code Up (코드업) ] 기초100제 문제해설 1028~1030 [기초-데이터형] (0) | 2023.08.30 |
[ Code Up (코드업) ] 기초100제 문제해설 1010~1019 [기초-입출력] (0) | 2023.08.29 |
[ Code Up (코드업) ] 기초100제 문제해설 1001~1007 [기초출력] (0) | 2023.08.29 |