본문 바로가기
Programming/Problem Solving

[코드업] 기초 100제(C)

by DONGKU 2020. 7. 17.

1008

1018

scanf(%d:%d)

1019

#include <stdio.h>

int main()
{
    int y,m,d;
    scanf("%d.%d.%d",&y,&m,&d);
    printf("%04d.%02d.%02d",y,m,d);

    return 0;
}

1020

#include <stdio.h>

int main(){
    int id_f, id_b;

    scanf("%d-%d", &id_f, &id_b);
    printf("%06d%07d", id_f, id_b);  // %d%d로 자리수 설정 안해주어 입력해 계속 오류

    return 0;
}

1022

fgets

1024. 단어 1개 입력받아 나누어 출력하기(설명)

#include <stdio.h>

int main(){
    char word[50];
    int i=0;

    scanf("%s", word);

    while( word[i]  != '\0' ){
        printf("\'%c\'\n", word[i]);
        i++;
    }

/*  for문 사용
 *for(i=0; d[i]!='\0'; i++){ //저장된 내용을 하나하나씩 검사해서 널문자가 아닐 동안 아래 실행
 *   printf("\'%c\'", d[i]);
 *}
/*
}

1025.정수 1개 입력받아 나누어 출력하기(설명)

scanf로 훨씬 쉽게 나누기 가능

#include <stdio.h>

int main(){
    int num, num1, num2, num3, num4, num5;

    scanf("%d", &num);
    num1 = num / 10000;
    num2 = (num%10000) / 1000;
    num3 = ((num%10000) % 1000) / 100;
    num4 = (((num%10000) % 1000) % 100) / 10;
    num5 = (((num%10000) % 1000) % 100) % 10;
    printf("[%d]\n[%d]\n[%d]\n[%d]\n[%d]", num1*10000, num2*1000, num3*100, num4*10, num5);

    return 0;
}

1029

int의 범위: -2,147,483,648 ~ 2,147,483,647

1035

C언어에서 소스 코드 작성시 0으로 시작하는 수는 8진수로 인식된다.

1037.정수 입력받아 아스키 문자로 출력하기

#include <stdio.h>

int main(){
    int dec;

    scanf("%d", &dec);
    printf("%c", dec);  // %c로 아스키 문자 출력

    return 0;
}

1038.정수 2개 입력받아 합 출력하기1(설명)

int의 범위: -2,147,483,648 ~ 2,147,483,647

#include <stdio.h>

int main(){
    long int num1, num2;  // 정수의 입력이므로 - 값도 존재. unsigned 쓸수 없음

    scanf("%ld %ld", &num1, &num2);
    printf("%ld", num1 + num2);

    return 0;
}

1040

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

printf("%.2f\n",(float)a / (float)b); // 3.33
printf("%.2f\n",(float)(a / b)); // 3.00 // 정수끼리 나눈 값의 '결과값 정수'를 소수 표현

1047 : [기초-비트시프트연산] 정수 1개 입력받아 2배 곱해 출력하기

정수를 2배로 곱하거나 나누어 계산해 주는 비트단위시프트연산자 <<, >>를 이용한다.

2진수 형태로 저장되어 있는 값들을 왼쪽(<<)이나 오른쪽(>>)으로
지정한 비트 수만큼 밀어주면 2배씩 늘어나거나 반으로 줄어드는데,

왼쪽 비트시프트(<<)가 될 때에는 오른쪽에 0이 주어진 개수만큼 추가되고,

오른쪽 비트시프트(>>)가 될 때에는
왼쪽0(0 또는 양의 정수인 경우)이나 1(음의 정수인 경우)이 개수만큼 추가된다.

범위(32비트)를 넘어서 이동되는 비트는 삭제된다.

int a=10;
printf("%d", a<<1); //10을 2배 한 값인 20 이 출력된다.
printf("%d", a>>1); //10을 반으로 나눈 값인 5 가 출력된다.
printf("%d", a<<2); //10을 4배 한 값인 40 이 출력된다.
printf("%d", a>>2); //10을 반으로 나눈 후 다시 반으로 나눈 값인 2 가 출력된다.

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

비교/관계연산자도 일반적인 사칙연산자처럼 주어진 두 수를 이용해 계산을 수행하고,
결과를 1(참), 또는 0(거짓)으로 계산해 주는 연산자이다.

printf("%d", 123<456); //비교 연산자 < 의 계산 결과인 1(참)이 출력된다.

1053. [기초-논리연산] 참 거짓 바꾸기

! 논리부정 연산자는 a(정수값)가 거짓(0, false)이면 1, 참(0이외의 값, true)이면 0
~ 비트 단위 부정 연산자는 비트의 1은 0으로 바꾸고 0은 1로 바꾼다.

printf("%d", !0); // 거짓의 반대, 즉 참인 1로 계산됨
printf("%d", !1); // 참의 반대, 즉 거짓인 0으로 계산됨
printf("%d", !999); // 참의 반대, 즉 거짓인 0으로 계산됨

1056 : [기초-논리연산] 참/거짓이 서로 다를 때에만(둘 중에 '하나만' 1일때 1) 참 출력하기

XOR(exclusive or, 배타적 논리합, ^)연산

printf(“%d”, (a&&!b)||(!a&&b)); //참/거짓이 서로 다를 때에만 1로 계산 // &&는 두 값이 모두 1일 때만 1
printf(“%d”, a!=b);
printf(“%d”, a^b);

1058 : [기초-논리연산] 둘 다 거짓일 경우만 참 출력하기

printf("%d", !(a||b)); // !(a&&b)는 둘중하나 참and 둘다 거짓일 경우참 ,논리표그려서 생각하면 편함

1059 : [기초-비트단위논리연산] 비트단위로 NOT 하여 출력하기

int 형의 정수 0
00000000 00000000 00000000 00000000

그리고 -1은 0에서 1을 더 빼고 32비트만 표시하는 형태로
11111111 11111111 11111111 11111111 로 저장된다.

-2는 -1에서 1을 더 빼면 된다.
11111111 11111111 11111111 11111110 로 저장된다.

그래서 int 형으로 선언된 변수에는 최소 -2147483648 을 의미하는
10000000 00000000 00000000 00000000 부터

최대 +2147483647 을 의미하는
01111111 11111111 11111111 11111111 로 저장될 수 있는 것이다.

그렇다면 -2147483648
10000000 00000000 00000000 00000000 에서 1을 더 뺀다면?

01111111 11111111 11111111 11111111 이 된다.
즉 -2147483649 가 아닌 +2147483647 이 되는 것이다.

이러한 것을 오버플로우(overflow, 넘침)라고 한다.

1060 : [기초-비트단위논리연산] 비트단위로 AND 하여 출력하기

비트단위 and(&) 연산은 두 비트열이 주어졌을 때,
둘 다 1인 부분의 자리만 1로 만들어주는 것과 같다.

이 연산을 이용하면 어떤 비트열의 특정 부분만 모두 0으로도 만들 수 있는데
192.168.0.31 : 11000000.10101000.00000000.00011111
255.255.255.0 : 11111111.11111111.11111111.00000000

두 개의 ip 주소를 & 연산하면
192.168.0.0 : 110000000.10101000.0000000.00000000 을 계산할 수 있다.

실제로 이 계산은 네트워크에 연결되어 있는 두 개의 컴퓨터가 데이터를 주고받기 위해
같은 네트워크에 있는지 아닌지를 판단하는데 사용
된다.

이러한 비트단위 연산은 빠른 계산이 필요한 그래픽처리에서
마스크연산(특정 부분을 가리고 출력하는)을 수행하는 데에도 효과적으로 사용된다.

1062 : [기초-비트단위논리연산] 비트단위로 XOR 하여 출력하기(설명)

배타적 논리합(xor, 서로 다를 때 1)의 의미를 가진다.

비트단위 연산은 빠른 계산이 필요한 그래픽처리에서도 효과적으로 사용된다.

구체적으로 설명하자면,
두 장의 이미지가 겹쳐졌을 때 색이 서로 다른 부분만 처리할 수 있다.
배경이 되는 그림과 배경 위에서 움직이는 그림이 있을 때,
두 그림에서 차이만 골라내 배경 위에서 움직이는 그림의 색으로 바꿔주면
전체 그림을 구성하는 모든 점들의 색을 다시 계산해 입히지 않고
보다 효과적으로 그림을 처리할 수 있게 되는 것이다.
비행기 슈팅게임 등을 상상해보면 된다.

XOR 마스크1 0
0 1
1 0

비트 반전

XOR 마스크0 0
0 0
1 1

비트 유지

 

 

'Programming > Problem Solving' 카테고리의 다른 글

0x01강 - 기초 코드 작성 요령 1  (0) 2021.01.07

댓글