Fascination
article thumbnail

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항 연산자는 복잡한 계산식이나 조건 처리, 비교 구조를 매우 간단히 표현할 수 있게 해준다고 함.

하나의 조건을 중첩해서 쓰는 방식이 헷갈려서 헤맸던 문제로, 괄호를 잘 사용해야 한다는 것을 기억하자..!

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!