W2: 코드업 기초 100제 70번 이하 문제들 중 가장 어려웠던 5문제 write-up 작성하기
코드업 기초 (22.04.25 ~ 22.05.02)
저번주에 이어서 31~70번 문제를 풀어보았다
이번에는 비트연산자를 복습할 수 있어서 좋았던 것 같다
개인적으로 힌트가 나온 문제들은 최대한 다른 방식으로 풀어보려했다 ㅎ
(if-else를 switch로 구현해본다던지,,)
# 1038: [기초-산술연산] 정수 2개 입력받아 합 출력하기 1
[문제] 정수 2개를 입력받아 합을 출력하는 프로그램을 작성해보자. (단, 입력되는 정수는 -1073741824 ~ 1073741824 이다.)
[입력]
2개의 정수가 공백으로 구분되어 입력된다.
** 주의: 계산의 결과가 int 범위를 넘어가는지를 잘 생각해 보아야 한다.
[출력]
두 정수의 합을 출력한다.
[풀이]
#include<stdio.h>
int main(){
long x, y;
scanf("%ld %ld",&x, &y);
printf("%.0f",(float)(x+y));
}
처음 풀이할 때 정수를 단순히 int형으로 생각했는데, 최대 범위가 될 수 있는 정수를 더할 경우 범위가 초과되는 것을 알 수 있었다.
정수보다 실수가 표현할 수 있는 값의 범위가 더 넓으므로 float형으로 출력하되
소숫점 아래를 표현하지 않도록 코드를 작성해 문제를 해결할 수 있었다.
유형 이름(바이트) | 값의 범위 |
int(4) | –2,147,483,648 ~ 2,147,483,647 |
long(4) | –2,147,483,648 ~ 2,147,483,647 |
long long(8) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
float | 3.4E+/-38(7개의 자릿수) |
double | 1.7E+/-308(15개의 자릿수) |
# 1039: [기초-산술연산] 정수 2개 입력받아 합 출력하기2
[문제] 정수 2개를 입력받아 합을 출력해보자.
단, 입력되는 정수는 -2147483648 ~ +2147483648 이다.
[참고] + 연산자를 사용하면 된다.
단, 계산된 결과가 int 형으로 저장할 수 있는 범위를 넘어갈 수 있기 때문에 다른 데이터형을 사용해야 한다.
[주의] int 데이터형은 %d로 입출력하고,
long long int 데이터형은 %lld로 입출력한다.
[입력]
2개의 정수가 공백으로 구분되어 입력된다
[출력]
두 정수의 합을 출력한다
[풀이]
#include<stdio.h>
int main(){
long long x, y;
scanf("%lld %lld",&x,&y);
printf("%.0lf",(double)(x+y));
}
입력받는 범위와 출력 범위를 넉넉하게 잡았다고 생각했는데 float으로 할 경우
overflow가 발생하여 값의 범위가 2가 차이가 발생하는 것을 보고 출력을 double로 변경했더니 해결할 수 있었음
# 1044: [기초-산술연산] 정수 1개 입력받아 1 더해 출력하기
[문제] 정수를 1개 입력받아 1만큼 더해 출력해보자.
단, -2147483648 ~ +2147483647 의 범위로 입력된다.
[주의] 계산되고 난 후의 값의 범위(데이터형)에 주의한다.
[참고] 어떤 변수(a)에 값을 저장한 후 a+1 의 값을 출력할 수도 있고,
++a 연산을 한 후에 출력할 수도 있다.
++a, --a, a++, a-- 와 같이 어떤 변수의 앞이나 뒤에 붙여
변수에 저장되어있는 값을 1만큼 더하거나 빼주는 연산자를 증감연산자라고 한다.
증감연산자를 변수 앞에 붙이면 그 변수를 사용하기 전에 증감을 먼저 수행하고,
증감연산자를 변수 뒤에 붙이면 일단 변수에 저장되어있는 값을 먼저 사용하고 난 후
나중에 증감을 수행한다.
[입력]
정수 1개가 입력된다.
단, -2147483648 ~ +2147483647
[출력]
입력된 정수에 1을 더해 출력한다.
[풀이]
#include<stdio.h>
int main(){
long long x;
scanf("%lld",&x);
printf("%lld",++x);
}
전위연산자와 후위연산자의 차이를 생각해야하는 문제였고 평소 습관대로 x++이라고 써서 틀렸던 문제였음
# 1048: [기초-비트시프트연산] 한 번에 2의 거듭제곱 배로 출력하기
[문제] 정수 2개(a, b)를 입력받아 a를 2b배 곱한 값으로 출력해보자.
0 <= a <= 10, 0 <= b <= 10
[참고] 예를 들어 1 3 이 입력되면 1을 23(8)배 하여 출력한다.
[예시]
int a=1, b=10;
printf("%d", a << b); //210 = 1024 가 출력된다.
[입력]
정수 2개가 공백을 두고 입력된다.
0<=a, b<=10
[출력]
a 를 2^b배 만큼 곱한 값을 출력한다.
[풀이]
#include<stdio.h>
int main(){
int x,y,result ;
scanf("%d %d",&x, &y);
if(y==0){
result = x;
}
else{
result = x*(2<<(y-1));
}
printf("%d",result);
}
지수 법칙을 잘 생각해야했던 문제로, 지수가 0일 경우에는 밑이 어떤 수이든 1이 됨
# 1064: [기초-삼항연산] 정수 3개 입력받아 가장 작은 수 출력하기
[문제] 입력된 세 정수 a, b, c 중 가장 작은 값을 출력하는 프로그램을 작성해보자.
단, 조건문을 사용하지 않고 3항 연산자 ? 를 사용한다.
[입력]
3개의 정수가 공백으로 구분되어 입력된다.
-2147483648 ~ +2147483648
[출력]
가장 작은 값을 출력한다
[풀이]
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d%d%c", &a, &b, &c);
printf("%d\n", a<b ? (a<c?a:c) : (b<c?b:c) );
return 0;
}
3항 연산자는 복잡한 계산식이나 조건 처리, 비교 구조를 매우 간단히 표현할 수 있게 해준다고 함.
하나의 조건을 중첩해서 쓰는 방식이 헷갈려서 헤맸던 문제로, 괄호를 잘 사용해야 한다는 것을 기억하자..!
'etc... > 빡공팟(P4C) 4기' 카테고리의 다른 글
[P4C] W7: 올드 스쿨 취약점과 올드 스쿨 공격 기법 공부하기 (0) | 2022.06.05 |
---|---|
[P4C] W6: Double Linked List CRUD 구현, 어셈블리로 구구단 구현, Stack 개념 공부하기 (0) | 2022.05.29 |
[P4C] W4-W5: C언어로 HTTP 서버 구현 (0) | 2022.05.21 |
[P4C] W3: 코드업 기초 100제 70번 대 이후 문제들 중 가장 어려웠던 10문제 write-up 작성하기 (0) | 2022.05.08 |
[P4C] W1: 코드업 기초 100제 20번~30번대 문제들 중 가장 어려웠던 5문제 write-up 작성하기 (0) | 2022.04.23 |