안 쓰던 블로그
C언어 알고리즘-정수, 실수, 문자/문자열 입출력 본문
알고리즘 문제풀이란?
Hello World! 알고리즘 세계에 오신 것을 환영합니다.
알고리즘이란 용어는 ‘문제를 해결하기 위한 절차나 방법’을 의미하는 포괄적인 단어입니다. 소프트웨어가 어떻게 돌아가는지부터 암호, 기계학습, 심지어는 ‘계란 샌드위치를 만드는 과정’도 알고리즘이라고 할 수 있습니다. 우리 소학회에서는 그중에서 프로그래밍에서 사용하는 알고리즘(자료구조, 그래프, 문자열 등)을 문제를 풀면서 트레이닝하는 ‘문제풀이’ 부분을 다룰 것입니다.
알고리즘 문제풀이는 크게 네 가지 단계로 나누어집니다.
(1)문제를 읽고 (2)입력을 받아서 (3) 계산하고 출력합니다.
이번 주에 할 내용은(1) 번과알고리즘 문제풀이의 가장 기본적인 단계, 입력과 출력입니다.
정수 입력과 출력
백준뿐만 아니라 거의 대부분의 문제는 아래 사진과 같은 형식을 가집니다.
기본적으로 문제/입력/출력과 시간 및 메모리 제한이 주어집니다.
#include <stdio.h>
int main() {
printf("Hello World");
}
C언어에서 출력은 printf로 합니다. 정해진 문자열을 출력할 때는 따옴표 안에 내용을 적어주면 됩니다. 만약 내용이 바뀌는 변수를 출력하고자 한다면 ‘형식 지정자’를 사용해야 합니다. 형식 지정자는 출력할 변수의 값이 정수인지, 실수인지, 문자인지 등을 알려줍니다. 형식 지정자에는 다양한 종류가 있지만 아래 표에 적힌 것이 가장 많이 쓰는 5가지 지정자입니다.
#include <stdio.h>
int main(){
int number;
scanf("%d", &number);
printf("%d", number);
}
1번 줄) scanf를 쓰기 위해서는 #include <stdio.h> 헤더를 불러와야 합니다.
4번 줄) 정수를 입력받기 위해 정수형 변수를 생성합니다.
5번 줄) 입력을 위해 scanf를 사용했습니다. 정수를 입력 받기 위해 정수 형식 지정자 %d를 썼습니다. 값을 저장할 곳인 number라는 변수의 메모리 주소를 알려주기 위해 &를 붙여줍니다.
6번 줄) 출력을 위해 printf를 사용했습니다. 출력할 때는 &를 쓰지 않아도 됩니다. %d를 쓴 자리에 number의 값이 출력됩니다.
주의할 점
#include <stdio.h>
int main() {
int a;
printf("%d", a);
}
변수를 선언한 뒤 아무 값도 넣어주지 않으면 이상한 값이 출력됩니다. 이 이상한 값을 보통 ‘쓰레기 값’이라고 부릅니다. 이 값은 변수 a가 할당된 메모리 값이 출력되는 것이지만 사람이 이해하기는 힘들기 때문에, 정해진 값을 넣어주는 초기화를 꼭 해주어야 합니다.
위에 A+B문제를 입출력 받으면 아래와 같이 됩니다.
#include <stdio.h>
int main(){
int a, b;
scanf("%d %d", &a, &b);
printf("%d", a+b);
}
5번 줄 ) 여러 개 입력을 한 번에 할 수 있습니다.
6번 줄) printf 함수 내에서 바로 계산을 할 수 있습니다.
참고
1. scanf는 형식 지정자가 문자인 경우를 제외하고는 모든 여백을 건너뜁니다. 스페이스, 탭, 줄바꿈을 모두 무시합니다.
2. scanf는 ‘ ‘(space), ‘\t’(tab), ‘\n’(enter)를 모두 입력의 끝으로 받습니다. 공백이나 줄바꿈도 입력받고 싶다면 ‘C언어 EOF’를 검색해보세요.
실수 입력과 출력
실수도 scanf를 쓰는 것은 같지만 형식 지정자를 %f, %lf로 씁니다.
%f는 float형, %lf는 double형을 의미합니다.
둘의 차이점은 크기입니다. double형이 더 큽니다. 자세히 따져보면 아래와 같습니다.
float-32비트, 6자리로 10^-38~10^+38
double-64비트, 16자리로 10^-308~10^308
#include <stdio.h>
int main() {
float a;
double b;
scanf("%f %lf", &a, &b);
printf("%f %f", a, b);
}
4번 줄) float형 변수 a를 선언했습니다
5번 줄) double형 변수 b를 선언했습니다
6번 줄) float는 %f, double은 %lf입니다
7번 줄) printf할 때는 %f로 통일하면 됩니다. 그 이유는, 본래 printf가 C95에서는 %lf를 지원하지 않았기 때문에 %f를 썼습니다. 하지만 C99에서 일관성을 위해서 %lf가 추가되었기 때문에 현재는 혼용이 가능합니다.
참고1
#include <stdio.h>
int main() {
float a = 1.1f;
float b = 1.1;
}
이 둘의 차이가 뭘까요? C언어는 실수 값을 모두 double형으로 받기 때문에 float형 변수에 넣으면 에러를 출력합니다. 그래서 이 숫자가 float라는 것을 확실히 해주기 위해 f를 붙입니다.
참고2
#include <stdio.h>
int main() {
float a;
printf("%.3f", a);
}
%.3f는 소수점 3자리까지 표시하라는 것을 의미합니다. 소수점 4자리에서 반올림해서 표시됩니다.
문자/문자열 입력과 출력
문자와 문자열에 대해서는 나중에 자세하게 다룰 예정이기 때문에 여기서는 간단하게만 짚고 넘어가겠습니다.
한 글자, 알파벳 하나는 %c로 입력받습니다.문자열은 %s로 입력받습니다.
char형 변수 하나 당 문자 하나씩 대응됩니다. 문자열은 알파벳이 모여서 한 문장이 만들어지는 원리와 똑같이 char형 변수 여러 개로 입력받으면 됩니다. char형 변수 여러 개를 모으는 간단한 방법 중에 하나로 배열이 있습니다.
#include <stdio.h>
int main() {
char a;
char b[10];
scanf("%c %s", &a, b);
printf("%c %s", a, b);
}
3번 줄) 문자는 char형 변수에 담깁니다.
4번 줄) char형 배열을 선언하면 문자열을 받을 수 있습니다.
5번 줄) char형은 %c고 char형 배열(=문자열)은 %s를 사용합니다. 문자열을 입력받을 때는 &를 붙이지 않아도 되는데, 그 이유는 배열일 경우 배열의 이름에 주소가 포함되기 때문입니다.
6번 줄) 출력도 똑같이 형식 지정자로 해줍니다.
주의
char형 배열을 선언할 때는 항상 범위를 최대 문자열 길이보다 적어도 하나 더 크게 잡아줘야 합니다. 컴퓨터가 배열을 인식할 때 얼마만큼의 길이인지를 확인하는데, 여기까지가 배열이 끝나는 지점이라고 알려주는 값이 맨 마지막에 들어가기 때문입니다. 종료 문자로는 0, NULL 등의 값이 들어갑니다.
예를 들어, 만약 code를 저장할 char형 변수를 선언하고자 한다면 char[5] = “code”; 라고 해줘야 합니다.
입출력 연습 문제
https://www.acmicpc.net/problem/1000 (정수)
https://www.acmicpc.net/problem/8393
https://www.acmicpc.net/problem/1546 (실수)
https://www.acmicpc.net/problem/2441 (문자)
https://www.acmicpc.net/problem/11721 (문자열)
https://www.acmicpc.net/problem/11719
'알고리즘 > Algorithm' 카테고리의 다른 글
C언어 1차원, 2차원 배열 (0) | 2019.05.09 |
---|---|
탐욕 알고리즘(greedy algorithm) (2) | 2019.05.09 |
완전 탐색(Brute Force) (2) | 2019.05.04 |
C언어 알고리즘 - 깊이 우선 탐색(DFS) (0) | 2018.03.27 |
C언어 알고리즘 - 그래프 개요, 정의, 종류 (0) | 2018.03.27 |