2021. 1. 8. 11:38ㆍ필요/코딩테스트(백준)
C언어를 사용해서 코드업 기초 100제를 풀어보았다.
웹 공부랑 병행하다보니 5일정도 걸린 것 같다.
어려운 문제는 없고, 기초를 다지기 좋은 내용인 것 같다.
몇몇 놓치기 쉬운 부분을 정리해 보았다.
<출력>
1004.
작은 따옴표(')는 /'를 사용해서 출력한다.
1005.
큰 따옴표(")는 /"를 사용해서 출력한다.
1006.
% 기호가 앞에 붙는 문자를 형식 지정자(format specifier)라고 한다.
그 위치에서 지정한 형식으로 값을 출력해 준다. ex. printf("%d", a);
퍼센트 문자(%)를 출력하려면 %%로 출력해 주어야 한다. ex. printf("%%");
<기초입출력>
1013.
scanf("%d%d", &a, &b); 두개 이상의 입력도 한번에 받을 수 있다.
1014.
scanf("%c %c", &x, &y);
문제에 따라 입력이 (A B)이런 형식으로 들어오면 %c%c는 오류가 발생하는 경우가 존재한다.
이는 C언어가 low level 언어이므로 발생하는 문제라고 한다. %c %c로 수정하면 해결된다.
1018.
scanf( ) 함수는 지정한 형식(format)에 따라 입력받는 함수이다.
ex. scanf("%d:%d", &h, &m); 이 경우 12:12 이런식으로 입력을 받음
1019.
%02d를 사용하면 2칸을 사용해 출력하는데, 한 자리 수인 경우 앞에 0을 붙여 출력한다.
ex. printf("%02d", a); a가 8이여도 08로 출력
1020.
0001이 int로 들어가면 1로 저장되므로, %04d를 사용해서 0001로 출력이 가능하다.
1022.
fgets( ) 를 사용하면 공백문자가 포함되어잇는 문장을 입력받아 저장할 수 있다.
ex. fgets(data, 2000, stdin);
공백이 포함된 문장을 키보드(stdin)로 입력받아 최대 2000자까지 data[ ] 공간에 저장하고 출력할 수 있다.
1023.
실수 1개를 입력받아 정수 부분과 실수 부분으로 나누어 출력할 수 있다.
ex. scanf("%d.%d", &a, &b); 입력이 1.22인 경우 a==1, b==22가 입력된다.
1024.
문자열 배열에서 문자열의 마지막임을 나타내기 위해 마지막에 널(NULL) 문자라는 특별한 의미를 가지는 문자를 삽입해 문장임을 나타낸다. 문자로는 '\0', 아스키문자의 정수값은 0을 의미하며 NULL 로도 사용할 수 있다.
1031.
%d는 10진수 형태로, %o를 사용하면 8진수(octal)로 입,출력된다.
1032.
%x는 16진수(hexadecimal) 소문자로 입,출력된다.
1033.
%X는 16진수(hexadecimal) 대문자로 입,출력된다.
[기초-비트시프트연산]
1047.
정수를 2배로 곱하거나 나누어 계산해 주는 비트단위시프트연산자 <<, >>를 이용한다.
왼쪽 비트시프트(<<)가 될 때에는 오른쪽에 0이 주어진 개수만큼 추가되고, 오른쪽 비트시프트(>>)가 될 때에는
왼쪽에 0(0 또는 양의 정수인 경우)이나 1(음의 정수인 경우)이 개수만큼 추가된다.
범위(32비트)를 넘어서 이동되는 비트는 삭제된다.
ex. 5(0101)에 <<를 하면 10(1010)이 된다.
int a=10;
printf("%d", a<<1); //10을 2배 한 값인 20이 출력된다.
printf("%d", a>>1); //10을 반으로 나눈 값인 5가 출력된다.
[기초-비트단위논리연산]
1059.
비트단위(bitwise) 연산자는 ~(bitwise not), &(bitwise and), |(bitwise or), ^(bitwise xor), <<(bitwise left shift),
>>(bitwise right shift) 가 있다.
ex. 1이 입력되었을 때 저장되는 1을 32비트를 2진수로 표현하면 00000000 00000000 00000000 00000001 이고,
~1은 11111111 11111111 11111111 11111110 가 되는데 이는 -2를 의미한다.
ex2.
int a=1;
printf("%d", ~a); //-2가 출력된다.
양의 정수는 2진수 형태로 바뀌어 저장되고,
음의 정수는 "2의 보수 표현"방법으로 저장된다.
~n = -n - 1 과 같은 관계로 표현된다.
1063.
3개의 요소로 이루어지는 3항(ternary) 연산자는
"조건식 ? (참일 때의 값) : (거짓일 때의 값)” 의 형태로 사용하는 연산자이다.
- 조건식의 계산 결과가 참인 경우에는 ':' 왼쪽의 값 또는 식으로 바뀌고,
- 거짓인 경우에는 ':' 오른쪽의 값 또는 식으로 바뀐다.
printf("%d", a>b ? a:b); //두 값 중 큰 값이 출력된다.
[기초-반복실행구조]
1071.
goto 명령문을 사용하면 간단한 반복문을 만든다. 무한 반복을 방지하기 위해 반복 실행 되는 도중에 조건을 검사해야 한다.
goto 이름:
이 명령은 이름: 이 작성된 곳으로 프로그램의 실행 흐름을 바꾸어 준다.
"이름:" 과 같이 콜론(:)이 붙어있는 부분을 이름표(label, 레이블)라고 한다.
레이블은 특별한 선언 없이 사용할 수 있으며 언더바(_)나 영문자로 시작하면 된다.
레이블은 한 단어처럼 공백없이 모두 붙여 써야 한다.
int n;
reload:
scanf("%d", &n);
printf("%d", n);
if(n!=0)
goto reload; // n=0이 아닐 때 reload:로 되돌아가서 코드 실행
1088.
반복문 안에서 continue;가 실행되면 그 아래의 내용을 건너뛰고, 다음 반복을 수행한다.(break와 구별!)
for(i=1; i<=n; i++) {
if(i%2==0) // 짝수일 때 출력 건너뜀
continue;
printf("%d ", i); // 홀수일 때 출력
}
이렇게 100제를 풀어봤는데, C++을 사용하지 않고 C언어를 사용했다.
C++이 C언어와 크게 다른점은 stl을 사용하는 것과 printf 대신 cout, scanf 대신 cin을 사용하는 것이라고 한다.
이제 C++의 문법을 공부하면서 백준 알고리즘 저지를 풀 예정이다.
'필요 > 코딩테스트(백준)' 카테고리의 다른 글
[백준/C++]#9012 - 올바른 괄호 문제 (0) | 2021.01.12 |
---|---|
[백준/C++]#11718 - 공백이 존재하는 문자열 출력 (0) | 2021.01.11 |
[백준/C++]#10951 - A + B (입력개수 x) (0) | 2021.01.11 |
[백준강의] 알고리즘과 입출력 개념 (0) | 2021.01.11 |
코딩테스트 (0) | 2021.01.08 |