코드업 C언어 기초 100제 - [기초-산술연산]

6720·2022년 9월 12일
0

CodingTest(코드업)

목록 보기
6/13
post-thumbnail

👨‍🏫 이번 목표

코드업 C언어 기초 100제에서 [기초-산술연산] 풀기

📒 문제 풀이

1038번

정수 2개를 입력받아 합을 출력하는 프로그램을 작성해보자.

(단, 입력되는 정수는 -1073741824 ~ 1073741824 이다.)

  • 내가 쓴 답
#include <stdio.h>

int main()
{
	long long int a, b;
	scanf("%d %d", &a, &b);
	printf("%d", a+b);
	return 0;
}
  • 정답 여부: X -> 음수가 출력됨.

  • 해설: 범위가 넘어가는 경우 이런 출력결과가 나오는데 long long int를 사용했다면 서식 지정자를 %lld로 설정해줘야 함. (부호 없는 경우는 %llu)
#include <stdio.h>

int main()
{
	long long int a, b;
	scanf("%lld %lld", &a, &b);
	printf("%lld", a+b);
	return 0;
}



1039번

정수 2개를 입력받아 합을 출력해보자

단, 입력되는 정수는 -2147483648 ~ +2147483648 이다.

  • 내가 쓴 답
#include <stdio.h>

int main()
{
	long long int a, b;
	scanf("%lld %lld", &a, &b);
	printf("%lld", a+b);
	return 0;
}
  • 정답 여부: O



1040번

입력된 정수의 부호를 바꿔 출력해보자.

단, -2147483647 ~ +2147483647 범위의 정수가 입력된다.

  • 내가 쓴 답
#include <stdio.h>

int main()
{
	long long int a;
	scanf("%lld", &a);
	printf("%lld", -a);
	return 0;
}
  • 정답 여부: O



1041번

영문자 1개를 입력받아 그 다음 문자를 출력해보자.

영문자 'A'의 다음 문자는 'B'이고, 영문자 '0'의 다음 문자는 '1'이다.

  • 내가 쓴 답
#include <stdio.h>

int main()
{
	int a;
	scanf("%d", &a);
	printf("%c", a+1);
	return 0;
}
  • 정답 여부: X -> 다른 글자가 나왔음.

  • 해설: 다음을 참고함.

숫자로 받아서 %d로 출력하면 숫자로, 숫자로 받아서 %c로 출력하면 문자로 출력한다는 전제조건이 있음. 그러므로 내가 작성했던 코드가 아예 틀린 말은 아니라는 뜻임.

숫자를 받아서 %c로 문자를 출력되도록 하는 것은 잘 작동함. 하지만 문자를 입력받도록 설정된 1041번은 int a에 문자가 저장되었으므로 이상한 답이 나왔던 것임.

입력받는 게 '영문자'이므로 a의 타입을 char로 바꿔줘야 함.



1042번

정수 2개(a,b)를 입력받아 a를 b로 나눈 몫을 출력해보자.

단, -2147483648 <= a <= b <= +2147483647, b는 0이 아니다.

  • 내가 쓴 답
#include <stdio.h>

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a/b);
    return 0;
}
  • 정답 여부: O

  • 해설?: 문제에 참고로 뭐라뭐라 써있길래 더 읽어봤음.

우선 정수/정수의 값은 정수로 나옴.
하지만 실수/정수, 정수/실수, (float)정수/정수, 정수/(float)정수처럼 한 쪽이 실수인 경우는 값이 실수로 나옴.

정수/실수 계산결과가 자동으로 실수형으로 바뀌는 것을 묵시적 (데이터)형변환이라고 하고,
어떤 값이나 결과의 데이터형을 강제로 바꾸는 것을 명시적 (데이터)형변환이라고 한다.

상황에 따라서 명시적 형변환이 필요한듯 함.



1043번

정수 2개(a, b) 를 입력받아 a를 b로 나눈 나머지를 출력해보자.

단, 0 <= a, b <= +2147483647, b는 0이 아니다.

  • 내가 쓴 답
#include <stdio.h>

int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a%b);
    return 0;
}
  • 정답 여부: O



1044번

정수를 1개 입력받아 1만큼 더해 출력해보자.

단, -2147483648 ~ +2147483647 의 범위로 입력된다.

  • 내가 쓴 답
#include <stdio.h>

int main()
{
    int a;
    scanf("%d", &a);
    printf("%d", a+1);
    return 0;
}
  • 정답 여부: X -> 부호가 반대로 나옴.

  • 해설: 거의 이런 문제는 범위 문제임.

만약 int의 끝 범위인 +2147483647가 입력된다고 했을 때 결과가 +2147483648로 int의 범위를 초과해버리므로 %d가 아닌 %lld를 사용해줘야 함.

#include <stdio.h>

int main()
{
    long long int a;
    scanf("%lld", &a);
    printf("%lld", a+1);
    return 0;
}

  • 실험: 지금 a까지 long long int로 바꿔버렸는데 출력되는 값 a+1만 %lld로 하면 어떻게 될까 궁금해짐.

안되는 걸 보면 범위문제는 예민하게 반응해서 확실히 맞춰줘야 하는 듯.



1045번

정수 2개(a, b)를 입력받아 합, 차, 곱, 몫, 나머지, 나눈 값을 자동으로 계산해보자.

단 0 <= a, b <= 2147483647, b는 0이 아니다.
첫 줄에 합
둘째 줄에 차,
셋째 줄에 곱,
넷째 줄에 몫,
다섯째 줄에 나머지,
여섯째 줄에 나눈 값을 순서대로 출력한다.
(실수, 소수점 이하 셋째 자리에서 반올림해 둘째 자리까지 출력)

  • 내가 쓴 답
#include <stdio.h>

int main()
{
    long long int a, b;
    scanf("%lld %lld", &a, &b);
    printf("%lld\n%lld\n%lld\n%lld\n%lld\n%lld", a+b, a-b, a*b, a/b, a%b, (float)(a/b));
}
  • 정답 여부: X -> 마지막 나눈 값이 잘못 나옴.

  • 해설: 서식 지정자와 명시적 (데이터)형변환을 확실히 체크해야 함.

서식 지정자: 명시적 형변환을 통해 실수로 변환했지만 서식 지정자는 %f가 아닌 %lld로 되어있음.

명시적 (데이터)형변환: (float)(a/b)는 a/b의 값을 실수로 변환한다는 뜻이므로 소수자리에 값이 오도록 하고 싶다면 (float)a/b로 한 쪽만 실수로 바꿔줘야 함.

그리고 반올림해 둘째 자리까지 출력하라고 했으므로 %0.2f로 바꿔줘야 함.

#include <stdio.h>

int main()
{
    long long int a, b;
    scanf("%lld %lld", &a, &b);
    printf("%lld\n%lld\n%lld\n%lld\n%lld\n%0.2f", a+b, a-b, a*b, a/b, a%b, (float)a/b);
    return 0;
}



1046번

정수 3개를 입력받아 합과 평균을 출력해보자.

단, -2147483648 ~ +2147483647

  • 내가 쓴 답
#include <stdio.h>

int main()
{
    long long int a, b, c;
    scanf("%lld %lld %lld", &a, &b, &c);
    printf("%lld %0.1f", a+b+c, ((float)(a)+b+c)/3);
    return 0;
}
  • 정답 여부: O



✨ 후기

1) 중간에 강의도 찾아봤는데 도움이 많이 됐음.
막상 설명하라고 하면 어떻게 설명해야 할지 감이 안 잡히는데 강의에서는 딱 해결해버리니깐 유용할 것 같기도 하면서 조금 허무해지기도 함.

profile
뭐라도 하자

0개의 댓글