본문 바로가기

Programming/C

[ProjectH4C] 코드업(CodeUp) 기초 100제 1041~1060 Write-up

#1041 문자 1개 입력받아 다음 문자 출력하기

문자 'A'의 아스키코드는 65, 'a'는 아스키코드 97이다. 모든 알파벳의 아스키코드는 이전 알파벳에 1을 더한 값과 같다.

 

ch를 입력받고, ch+1을 출력한다면 다음 알파벳이 나온다.

#include <stdio.h>

int main(){
    char ch;
    scanf("%c", &ch);
    printf("%c", ch+1);
    
    return 0;
}

#1042 정수 2개 입력받아 나눈 몫 출력하기 

C언어에 나누기 연산에 관련 된 연산자로 / 과 %가 있다.

/는 몫을 반환하고, %는 나머지를 반환한다.

예를 들어 7 나누기 2는 몫이 3이고 나머지가 1인데, 각각을 7/2, 7%2로 출력할 수 있다.

#include <stdio.h>

int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a/b);
    
    return 0;
}

#1043 정수 2개 입력받아 나눈 나머지 출력하기

#include <stdio.h>

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

 

#1044 정수 1개 입력받아 1 더해 출력하기

어떠한 변수에 1만큼 값을 더하거나 빼는 연산자로 ++, --가 있다. 이들을 증감연산자라고 하며, 각각을 증가연산자, 감소연산자라고 한다.

a=1; 이라는 변수가 있을 때, a++, ++a와 같이 사용할 수 있는데, a++은 a의 값을 먼저 가져와서 사용한 후에 1 증가시킨다는 뜻이고, ++a는 a에 1 증가시킨 값을 가져와 사용한다는 뜻이다. --도 같다. 예를 들어,

int a=1;

printf("%d", a++);

printf("%d", --a);

이렇게 있으면, 첫번째 출력문에서는 a를 먼저 사용한 후에 1 증가시킨다는 의미이므로, 1이 출력되고, 그 이후에 a=2가 된다.

두번째 출력문에서는 a를 먼저 감소시킨 후에 사용하겠다는 의미이므로, a=1이 되고 1이 출력된다.

 

주의할 점 -> 문제에서 범위의 최대값에 1을 더하면 int의 범위를 벗어나게 돼서 long int를 사용해야 한다.

#include <stdio.h>

int main(){
    long int n;
    scanf("%ld", &n);
    printf("%ld", ++n);
    
    return 0;
}

#1045 정수 2개 입력받아 자동 계산하기 

나눈 값? -> 두 개의 정수 a=7, b=2가 있다고 가정한다. a/b는 몫을, a%b는 나머지를 출력하는데, 실수의 범위에선 a/b가 하나의 실수 값 자체로 나온다. 계산식에 실수가 하나라도 포함되어 있다면 해당 식은 실수 식으로 인식되어서 a/b가 실수값으로 반환된다. 두 개의 정수형을 입력받고 나눈 값을 출력하고 싶다면 타입 캐스팅을 사용해야 한다.

 

타입캐스팅(Type Casting) -> 형 변환이라고도 하며, 변수 선언시에 정해준 자료형말고 일시적으로 다른 자료형처럼 사용할 수 있도록 바꾸어주는 기능이다. 실제로 변수의 자료형이 변하는 것은 아니고 변환한 자료형의 성질처럼 사용할 수 있그며, 타입캐스팅을 적용시킨 문장이 끝난 후 해당 자료형은 다시 원래의 자료형처럼밖에 사용하지 못한다.

 

int a=1;

printf("%f", (float)a); //정수형 변수 a를 Float형으로 변환. 실제로 1이 아닌 1.000000 출력.

 

두 정수를 나눈 값을 출력하려면 둘 중에 하나를 float 또는 double형으로 타입캐스팅 해주면 된다. 이 때의 출력은 당연히 %f 또는 %lf로 해주어야 한다.

#include <stdio.h>

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

 

#1046 정수 3개 입력받아 합과 평균 출력하기

평균은 모든 값을 다 더한 후에 항목의 개수를 나누어서 구할 수 있다. 이 때 주의할 점은, 평균은 항상 나누어 떨어지지 않기 때문에 실수형으로 계산해야 한다는 것이다. 또 주어진 범위 내에서 가장 큰 수 3개를 더하면 int의 범위를 넘어가기 때문에 long int를 사용한다.

#include <stdio.h>

int main(){
    long int a, b, c;
    scanf("%ld %ld %ld", &a, &b, &c);
    printf("%ld \n", a + b + c);
    printf("%.1f", (float)(a + b + c)/3);
    
    return 0;
}

#1047 정수 1개 입력받아 2배 곱해 출력하기

비트 단위로 연산하는 연산자 중 시프트연산자라는 게 있다. 기호로는 <<, >>로 표현한다.

int 형으로 선언된 변수 a에 4가 저장되어 있다고 한다. 이는 메모리에 4라는 숫자로 저장된 것이 아니라 4byte 공간 내에 이진 수로 4가 표현 되어 있다. a의 주소에 저장된 값은 다음과 같다.

0000 0000  0000 0000  0000 0000  0000 0100

여기서 a<<1을 연산한다면, 모든 숫자들이 왼쪽으로 한칸씩 이동하게 된다. 이 때, 맨 왼쪽에 있던 숫자는 사라지고, 맨 오른쪽에는 0이 들어오게 된다. 

a>>1을 연산한다면, 모든 숫자들이 오른쪽으로 한칸씩 이동하게 된다. 이 때, 맨 오른쪽에 있던 숫자는 사라지고, 맨 왼쪽에는 양수라면 0이, 음수라면 1이 들어오게 된다.

여기서 끝이 아니라, 시프트 연산한 값과 원래 값을 10진수로 비교해보면, a<<1은 a의 2배, a>>1은 a의 1/2배가 된다. 그렇기에 시프트 연산자를 이용해서 2를 곱하거나 나누는 연산을 처리할 수가 있다.

#include <stdio.h>

int main(){
    int a;
    scanf("%d", &a);
    printf("%d", a<<1);
    
    return 0;
}

#1048 한 번에 2의 거듭제곱 배로 출력하기

a를 2배 증가시키는 법은 a<<1이다. a를 2^2배 증가시키는 법은 a<<2가 된다. a를 2^3배 증가시킨다면 a<<3이 되겠다.

이를 일반화하면, a를 2^b배 증가시키는 법은 a<<b가 된다.

#include <stdio.h>

int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a<<b);
    
    return 0;
}

 

#1049 두 정수 입력받아 비교하기1

C언어에서는 거짓을 0으로 표현하고, 0이 아닌 모든 수는 참으로 표현된다. 편의상 참은 1이라고 한다.

참, 거짓 값은 비교연산의 결과값으로 반환되는데, 연산의 결과가 참이면 1, 거짓이면 0이 반환된다.

비교 연산으로는 >, <, >=, <=, ==, != 6개가 있다.

#include <stdio.h>

int main(){
    int a, b;
    
    scanf("%d %d", &a, &b);
    printf("%d", a>b);
    
    return 0;
}

#1050 

a==b -> a와 b가 같은지 비교. 참이면 1, 거짓이면 0 반환.

#include <stdio.h>

int main(){
    int a, b;
    
    scanf("%d %d", &a, &b);
    printf("%d", a==b);
    
    return 0;
}

#1051 두 정수 입력받아 비교하기3

b가 a보다 크거나 같은 경우가 참이기 때문에, b>a가 아닌 b>=a로 연산해야 한다.

#include <stdio.h>

int main(){
    int a, b;
    
    scanf("%d %d", &a, &b);
    printf("%d", b>=a);
    
    return 0;
}

 

#1052 두 정수 입력받아 비교하기4

a!=b -> a와 b가 다르면 1, 같으면 0 반환.

#include <stdio.h>

int main(){
    int a, b;
    
    scanf("%d %d", &a, &b);
    printf("%d", a!=b);
    
    return 0;
}

#1053 참 거짓 바꾸기

논리 연산자 !는 반환된 값을 반대로 바꾸는 역할을 한다.

예를 들어, a=2 b=1이고, a>b 연산을 해주면 참이라는 값이 반환되지만, !(a>b)처럼 앞에 !를 붙여주면 그의 반대값이 반환되어서 거짓이 반환된다.

#include <stdio.h>

int main(){
    int a;
    
    scanf("%d", &a);
    printf("%d", !a);
    
    return 0;
}

 

#1054 둘 다 참일 경우만 참 출력하기

&&연산자(AND연산자)는 연산자 기준으로 왼쪽과 오른쪽이 모두 참인 경우에만 참, 나머지는 거짓을 반환한다.

#include <stdio.h>

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

#1055 하나라도 참이면 참 출력하기

||연산자(OR연산자)는 둘 중에 하나라도 참이면 참, 둘 다 거짓이면 거짓을 반환한다.

#include <stdio.h>

int main(){
    int a,b;
    
    scanf("%d %d", &a, &b);
    printf("%d", a||b);
    
    return 0;
}

#1056 참/거짓이 서로 다를 때에만 참 출력하기

두 개의 논리값이 각각 0, 1 이거나 1, 0일때만 참인 연산자를 배타적 논리합(XOR, Exclusive OR)이라고 한다.

이를 식으로 쓰면 A XOR B = (A and !B) || (!A and B)가 된다.

#include <stdio.h>

int main(){
    int a,b;
    
    scanf("%d %d", &a, &b);
    printf("%d", (a&&!b)||(!a&&b));
    
    return 0;
}

 

#1057 참/거짓이 서로 같을 때에만 참 출력하기

XOR과 정 반대이므로, !((a&&!b)||(!a&&b))가 되겠다.

#include <stdio.h>

int main(){
    int a,b;
    
    scanf("%d %d", &a, &b);
    printf("%d", !((a&&!b)||(!a&&b)));
    
    return 0;
}

 

#1058 둘 다 거짓일 경우만 참 출력하기

||연산자는 둘 다 거짓인 경우만 거짓, 그 외의 경우는 참을 반환한다. !(a||b)는 둘 다 거짓인 경우만 참이 된다.

#include <stdio.h>

int main(){
    int a,b;
    
    scanf("%d %d", &a, &b);
    printf("%d", !(a||b));
    
    return 0;
}

#1059 비트단위로 NOT 하여 출력

비트단위연산자에는 >>, << 말고도 ~, &, |, ^라는 연산자가 있다.

그 중 ~연산자는 각각의 비트 단위에 NOT연산을 실행하여서 1은 0으로, 0은 1로 바꾸어 준다.

#include <stdio.h>

int main(){
    int a;
    scanf("%d", &a);
    printf("%d", ~a);
    
    return 0;
}

#1060

& 연산자 -> 비트단위연산자로 두 정수를 비트로 변환 후 각각의 자리마다 &연산을 시행한 후 결과를 반환한다.

#include <stdio.h>

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