1번 1035: [기초-출력변환] 16진 정수 1개 입력받아 8진수로 출력하기
입력
16진 정수 1개가 입력된다.
(단, 16진수는 영문 소문자로 입력된다.)
입력 예시
f
출력
8진수로 바꾸어 출력한다.
출력 예시
17
풀이
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
int main() {
int num;
scanf("%x", &num);
printf("%o\n", num);
return 0;
}
|
cs |
위와 같이 문제를 해결할 수 있었습니다.
그러다 scanf가 궁금해져 scanf에 대해 찾아보다 다음과 같은 내용을 찾을 수 있었습니다.
"scanf는 입력된 값들을 왼쪽부터 읽는다. 이때 서식문자에 알맞은 형식의 데이터가 입력되었는지 확인한다.
알맞지 않은 데이터일 경우 다음 서식문자를 이용하여 입력 값을 읽습니다. 또한 빈 칸은 필요에 따라 무시되기도 한다."
scanf("%d%d%f%f", &i, &j, &x, &y);
|
ㅇcs |
위와 같은 코드를 통해 "1-20.3-4.0e3"을 입력하면 다음과 같이 동작합니다.
1. 첫 번째 %d를 통해 정수 1을 입력받고 뒤에 오는 "-" 정수형에서 숫자 뒤에 올 수 없으므로 그 다음 서식문자를 통해 입력된다. (i = 1)
2. 두 번째 %d를 통해 첫 번째 %d에서 받지 못한 "-"를 입력 받는다. 그리고 정수형에서는 "."을 받을 수 없으므로 "-20"까지 입력받는다. (j = -20)
3. 첫 번째 %f를 통해 "."부터 입력을 받는데 실수에서 "-"는 숫자 뒤에 올 수 없으므로 ".3"까지 입력된다. (x = .3)
4. 두 번째 %f를 통해 나머지 값들인 "-4.0e3"을 입력받는다.(y = -4.0e3)
따라서 위 예시를 통해 scanf는 서식문자열에 따라 입력 값을 검사하여 변수에 저장하는 것을 알 수 있었습니다.
2번 1041 : [기초-산술연산] 문자 1개 입력받아 다음 문자 출력하기
입력
영문자 1개가 입력된다.
입력 예시
a
출력
다음 문자를 출력한다.
출력 예시
b
풀이
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
int main() {
char c1;
scanf("%c", &c1);
printf("%c", c1+1);
return 0;
}
|
cs |
입력을 캐릭터로 받아 해당 값에 상수를 더하여 입력 문자 다음의 문자를 얻을 수 있습니다.
위 내용이 가능한 이유는 int이하의 변수 타입과 int와 연산을 할 경우 int 이하의 변수 타입이 int로 형변환 되기 때문입니다. float과 int의 연산에서 결과가 float으로 나오는 것과 같다고 볼 수 있을 것 같습니다.
3번 1043 : [기초-산술연산] 정수 2개 입력받아 나눈 나머지 출력하기
입력
정수 2개(a, b)가 공백을 두고 입력된다.
단, 0 <= a, b <= +2,147,483,647, b는 0이 아니다.
입력 예시
10 3
출력
a 를 b로 나눈 나머지를 출력한다.
출력 예시
1
풀이
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
int main() {
unsigned int a;
int b;
scanf("%u %d", &a, &b);
printf("%d", a % b);
return 0;
}
|
cs |
a의 범위가 0이상이므로 unsigned int로 지정해주었고, b는 int로 지정해주어 문제를 해결하였습니다.
그러다 unsigned 자료형에 음수값을 넣었을 때 어떻게 되는지 궁금하여 테스트를 해보았었는데 음수 값이 나왔었습니다.
1
2
3
4
5
6
7
|
#include <stdio.h>
int main() {
unsigned int a = -1;
printf("%d", a);
return 0;
}
|
cs |
1. printf 에서 맨 앞의 format string 제외하면 나머지는 va_arg/va_list 로 넘어가기때문에 format string 뒤쪽의 argument 에 대해서는 타입 정보를 못 받습니다.
2. 즉, 순수하게 1111...1111 같은 비트 덩어리만 넘어가는거고, 저 bit 를 해석하는건 %d 에 달려있습니다.
3. %d 는 int 에 대응되는거니 저 bit 덩어리를 int 로 해석해서 -1 이 되는 것이다.
4. 같은 이유로, printf 에서는 float 이나 double 이나 둘 다 %f 를 써도 되지만, scanf 에서는 %f, %lf 구분을 해줘야 합니다.
1
2
3
4
5
6
7
|
#include <stdio.h>
int main() {
unsigned int a = -1;
printf("%u", a);
return 0;
}
|
cs |
unsigned int가 표현할 수 있는 가장 작은 값인 0을 지나 언더플로우가 일어났기 때문에 4294967295와 같은 값이 나오게 된 것을 알 수 있었습니다.
4번 1057 : [기초-논리연산] 참/거짓이 서로 같을 때에만 참 출력하기
입력
1 또는 0의 값만 가지는 2개의 정수가 공백을 두고 입력된다.
입력 예시
0 0
출력
참/거짓이 서로 같을 때에만 1을 출력하고, 그 외의 경우에는 0을 출력한다.
출력 예시
1
풀이
같은 참/거짓일 때 1값을 출력하므로 XNOR 연산을 이용합니다.
1
2
3
4
5
6
7
8
|
#include <stdio.h>
int main() {
int num1, num2;
scanf("%d %d", &num1, &num2);
printf("%d", !!num1 == !!num2);
return 0;
}
|
cs |
!를 한 번 해주어서 불리언으로 만들고 다시 !를 해주어 원래 값이 가지는 참/거짓 값으로 변환해주었습니다.
하지만 위는 "=="이라는 비교연산자가 사용되었기 때문에 다시 논리연산자만을 이용하여 다시 풀었습니다.
1
2
3
4
5
6
7
8
|
#include <stdio.h>
int main() {
int num1, num2;
scanf("%d %d", &num1, &num2);
printf("%d", (!num1 && !num2) || (num1 && num2));
return 0;
}
|
cs |
5번 1064 : [기초-삼항연산] 정수 3개 입력받아 가장 작은 수 출력하기
문제 설명
입력
3개의 정수가 공백으로 구분되어 입력된다.
-2147483648 ~ +2147483648
입력 예시
3 -1 5
출력
가장 작은 값을 출력한다.
출력 예시
-1
풀이
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
int main() {
int num1, num2, num3;
scanf("%d %d %d", &num1, &num2, &num3);
printf("%d", num3 < (num1 < num2 ? num1 : num2) ? num3: (num1 < num2 ? num1 : num2));
return 0;
}
|
cs |
삼항연산자에 대해 알고 있었지만 활용해 본 기억이 많이 없었습니다.
이번 문제를 통해 삼항 연산자의 참/거짓 부분을 깊게 만들어 세 수를 비교할 수 있었습니다.
1. 입력 받는 값 범위와 해당 값의 연산으로 인해 바뀌는 값의 범위를 생각하여 이에 알맞은 자료형을 선택해야 한다.
2. 캐릭터형과 상수의 덧셈이 가능하다.
3. 자료형이 다른 변수의 연산에서 크기가 작은 데이터 타입이 큰 데이터 타입으로 형변환 된다.
등과 같은 내용을 리마인드 할 수 있는 문제들이었습니다.
참고
https://buyandpray.tistory.com/70
[C/C++] scanf의 작동원리
scanf()는 사용자의 입력을 특정 형식(format string)에 맞춰 읽은 뒤 변수에 값을 저장한다. 이 형식(format string)에는 일반적인 문자(ex. a, b, c, 공백 등)나 변환 문자(conversion specification)가 들어갈..
buyandpray.tistory.com
https://cheerant.tistory.com/43
char형 연산
백준 1194번 문제에서 char형을 다루면서 생긴 의문이다. System.out.println('a'-'f'); --> -5 System.out.println('b'-'b'); --> 0 아스키코드 값이 연산 되는 것이라고 짐작은 했지만 정확하게 알고 넘어가기..
cheerant.tistory.com
https://www.clien.net/service/board/kin/6528386
[C++] unsigned int 변수에 음수가 저장되나요? : 클리앙
unsigned 는, 양수만 다루도록 한다고 알고있는데.. VS2008 환경에서 실제로 다음과 같이 실행해보면, unsigned int x = -1; printf("%d", x); 출력이 -1 로 나옵니다. 음.. 그럼 음수도 저장 된다고 봐야되는 거
www.clien.net
https://dojang.io/mod/page/view.php?id=32
C 언어 코딩 도장: 7.2 오버플로우와 언더플로우 알아보기
만약 정수 자료형에서 저장할 수 있는 범위를 넘어서면 어떻게 될까요? 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요. integer_overflow.c #include int main() { char num1 = 128; // char에 저장할 수
dojang.io
'[P4C 4기] > 과제' 카테고리의 다른 글
[P4C 4기] 7주차 과제 올드 스쿨 (Buffer Overflow, Format String Bug, RET overwrite, memory write primitive) (0) | 2022.06.03 |
---|---|
[P4C 4기] 6주차 과제 - Doubly Linked List 구현, 구구단 with 어셈블리어, Stack 문서 요약 (0) | 2022.05.29 |
[P4C 4기] 4~5주차 - 과제C언어로 HTTP 서버 구현 (0) | 2022.05.17 |
[P4C 4기] 3주차 과제 - 코드업 기초 100제 (~100) (0) | 2022.05.03 |
[P4C 4기] 1주차 과제 - 코드업 기초 100제 (20~30) (0) | 2022.04.18 |