본문 바로가기

Programming/C

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

#1061 비트단위로 OR하여 출력하기

두 개의 정수를 |(비트단위 OR연산자) 연산하면, 32개의 비트가 각 자리마다 OR연산이 되어서 반환된다.

#include <stdio.h>

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

 

#1062 비트단위로 XOR하여 출력하기

비트단위 연산자는 XOR도 지원한다. XOR은 A ^ B와 같이 사용하면 된다.

#include <stdio.h>

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

 

#1063 두 정수 입력받아 큰 수 출력하기

C언어에는 삼항연산자라는 게 있다. 만약 내가 항상 같은 값을 출력하는게 아니라 상황에 따라 다른 값을 출력하고 싶다면

삼항연산자를 이용하면 된다. 기본 형태는 다음과 같다.

 

(조건) ? 실행1 : 실행2;

 

해당 줄에서 먼저 조건을 확인한다. 조건식이 참일 경우엔 실행1을, 조건식이 거짓일 경우엔 실행2를 실행하게 된다.

#include <stdio.h>

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

 

#1064 정수 3개 입력받아 가장 작은 수 출력하기

삼항연산자의 단점은 두 가지 경우 이상은 정의할 수 없다는 것이다. 만약 3개의 수를 비교하는 코드를 삼항연산자를 이용해서 작성하고

싶은 경우엔, 삼항연산자를 중첩해서 쓰면 된다.

 

세 수 a, b, c중 최소값 구하는 과정.

 

1. a가 b와 c보다 작은지 비교. 참이면 a 반환.

2.거짓인 경우 a가 최소값이 아니라는 의미이기 때문에 b와 c의 대소만 비교해주면 됨.

이를 식으로 쓰면 다음과 같다.

 

(a<b && a<c) ? a : (b<c ? b : c)

#include <stdio.h>

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

 

#1065 정수 3개 입력받아 짝수만 출력하기

삼항연산자는 조건에 따른 두 가지 서로 다른 경우가 존재할 때 한 줄로 편리하게 작성할 수 있다는 장점이 있지만, 조건이 여러개일 경우

식이 복잡해지는 단점이 있다. 이를 극복하기 위해 if문(조건문)이 존재하는데, if문은 조건의 개수가 몇개든 상관이 없다는 장점이 있다.

기본 형태는 다음과 같다.

 

if(조건1){

    내용1

}

else if(조건2){

    내용2

}

else{

    내용3

}

 

처음 조건문을 만나면 조건1이 참인지 거짓인지 확인한다. 참일 경우 내용 1을 실행한 후 if문을 빠져나가고, 거짓일 경우 else if(조건2)으로 넘어간다.

그 후 조건2가 참인지 거짓인지 확인 한 후에 참일 경우 내용2를 실행한 후 if문을 빠져나가고, 거짓일 경우 else로 넘어간다.

else는 위의 조건이 참이 아닌 모든 경우 실행되므로, 조건1과 조건2가 거짓이라면 내용3이 실행된 후 if문을 빠져나가게 된다.

else if와 else는 필요한 경우에 써주며, 생략해도 무방하다.

 

주의할 점 -> 해당 문제는 a, b, c 각각이 짝수인지를 확인해야 하는데, 만약

 

if(a%2==0)

    printf("%d", a);

else if(b%2==0)

    printf("%d", b);

else if(c%2==0)

    printf("%d", c);

 

와 같이 작성한다면, 맨 처음 if문에서 a가 짝수일 경우에 a를 출력하고 if문을 빠져나가게 되므로, b와 c에 대한 if가 실행되지 않는다.

따라서 a, b, c 각각의 경우에 대해 if문을 따로 써주어야 한다.

 

#include <stdio.h>

int main(){
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    
    if(a%2==0){
        printf("%d \n", a);
    }
    if(b%2==0){
        printf("%d \n", b);
    }
    if(c%2==0){
        printf("%d \n", c);
    }
    
    return 0;
}

 

#1066 정수 3개 입력받아 짝/홀 출력하기

#include <stdio.h>

int main(){
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    
    if(a%2==0){
        printf("even\n");
    }
    else
        printf("odd\n");
        
    if(b%2==0){
        printf("even\n");
    }
    else
        printf("odd\n");
        
    if(c%2==0){
        printf("even\n");
    }
    else
        printf("odd\n");
    
    return 0;
}

 

#1067 정수 1개 입력받아 분석하기

if문 내에 새로운 if문을 작성할 수도 있다.

#include <stdio.h>

int main(){
    int x;
    
    scanf("%d", &x);
    if(x%2==0){
        if(x<0)
            printf("minus\n");
        else
            printf("plus\n");
        printf("even\n");
    }
    else {
        if(x<0)
            printf("minus\n");
        else
            printf("plus\n");
        printf("odd\n");
        
        return 0;
    }
}

 

#1068 정수 1개 입력받아 평가 출력하기

점수가 100~90은 A, 89~70은 B, 69~40은 C, 39~0은 D이다.

이때 각 조건들을 (score >= 90 && score<=100), (score>=40 && score<=69) 처럼 직접 범위를 하나하나 정해줄 수도 있지만,

if문의 특성을 이용해서

 

if(score>=90)
	printf("A");
else if(score>=70)
	printf("B");
else if(score>=40)
	printf("C");
else
	printf("D");



 와 같이 작성하여도 된다. 일단 문제에서 입력 값이 0~100이라고 가정하였으니, 입력은 항상 0~100이라고 가정한다.

if문을 처음 만나면 score가 90 이상인지 확인한다. 이때의 조건이 거짓이면, 2번째 if문으로 넘어간다.

처음의 if문에서 거짓이 나왔기 때문에 score가 90보다 작다는 말이 되고, 두번째 if문이 참이라면, score가 70 이상이라는 말이 되기 때문에

else if(score >= 70) 이 참이라면, score의 값은 70~89 사이가 된다. 만약 두 번째 if문도 거짓이고, 3번째 if문이 참이라면 동일하게 적용되어서 score의 값은 40~69가 된다.

 

해당 코드는 만약 101이 들어와도 A를 출력하고, -100이 들어와도 D를 출력하기에 완벽한 코드는 아니다. 문제에서 점수는 0~100 사이의

값이라고 가정하였기 때문에 이렇게 작성하였지만, 사용자, 특히 크래커라고 부르는 악성 해커들은 이러한 허점을 이용해서 공격을 하기 때문에 값이 0과 100 사이의 값이 아닐 때의 경우도 작성해야 한다. 이를 예외 처리라고 한다.

 

#include <stdio.h>

int main(){
    int score;
    scanf("%d", &score);
    
    if(score<=100 && score >=0){ //score가 정상적인 입력이 아니라면 실행이 안되게끔 처리해줌.
        if(score>=90)
            printf("A");
        else if(score>=70)
            printf("B");
        else if(score>=40)
            printf("C");
        else
            printf("D");
    }    
    return 0;
}

 

 

 

 

#1069 평가 입력받아 다르게 출력하기

조건문엔 if 말고 switch도 있다. 기본 동작은 if와 같지만 정수의 값만 사용할 수 있다.

 

switch(정수){

case 조건1:

    내용

    break;

case 조건2:

    내용

    break;

default:

    내용

    break;

}

 

기본 형태는 위와 같다. 입력한 정수가 조건1과 같을 경우 case 조건1의 내용 실행, 조건2와 같을 경우 case 조건2의 내용 실행, 그 외의

경우엔 default의 내용을 실행한다. 이때 주의할 점은, if문과 달리 switch는 case를 실행 한 후에 자동으로 빠져나가지 않기 때문에 

만약

 

case 1:

  내용

case 2:

  내용

  break;

case 1:
  내용
case 2:
  내용  
  break;

 

위와 같이 코드를 작성한 후, case 1이 실행되고 나면, 그 후에 case 2의 내용까지 실행되게 된다. 그러므로 각 case마다 break를 꼭 써주어야 한다.

#include <stdio.h>

int main(){
    char grade;
    scanf("%c", &grade);
    
    switch(grade){
        case 'A':
        printf("best!!! \n");
        break;
        case 'B':
        printf("good!! \n");
        break;
        case 'C':
        printf("run! \n");
        break;
        case 'D':
        printf("slowly~ \n");
        break;
        default:
        printf("what? \n");
        break;
    }
    
    return 0;
}

#1070 월 입력받아 계절 출력하기

if문은 조건을 이용하여 범위 내의 여러개의 값에 대해 동일한 실행을 하도록 할 수 있지만 switch문은 각각 한 가지 경우에 대해서만

실행 할 수 있기 때문에, switch문에서 여러 개의 값에 같은 실행을 하도록 코드를 작성하고 싶다면,

 

case 1:

case 2:

case 3:

    내용1

 

과 같이 작성해야 한다. 위의 경우, 1, 2, 3이 입력 됐을 때 동일한 실행을 할 수 있다. 수가 적다면 이렇게 해도 되겠지만, 

#1068과 같이 하나의 범위에 해당하는 정수값이 20개씩, 혹은 그 이상 존재할 경우, 각각의 case를 직접 입력해야 하는 번거로움이 있기 때문에 이런 경우엔 if문을 쓰는 것이 조금 더 바람직하다.

 

#include <stdio.h>

int main(){
    int month;
    
    scanf("%d", &month);
    
    switch(month){
        case 12:
        case 1:
        case 2:
            printf("winter \n");
            break;
            
        case 3:
        case 4:
        case 5:
            printf("spring \n");
            break;
            
        case 6:
        case 7:
        case 8:
            printf("summer \n");
            break;
            
        case 9:
        case 10:
        case 11:
            printf("fall \n");
            break;
    }
    
    return 0;
}

 

#1071 0 입력될 때까지 무한 출력하기1

지금까지는 입력을 한번하고 해당 입력에 대한 실행을 한번씩 했다.

만약 같은 동작을 여러번 반복해야 하는 경우, 반복문을 활용하면 된다.

 

반복문의 종류에는 for, while, do~while이 있고, 예외적으로 goto라는 명령문이 있다.

각각의 기본 형태는 다음과 같다.

 

for(초기식; 조건식; 증감식){

    반복 실행할 내용;

}

 

while(조건){

    반복 실행할 내용;

}

 

do {

    반복 실행할 내용;

} while(조건);

 

while과 do~while의 다른 점 :

while은 조건이 참이면 실행, 거짓이면 실행하지 않고 지나치지만, do~while은 처음에 한번은 무조건 실행한 후 조건을 비교해서 거짓인 경우 while문을 빠져나가게 된다. 한번은 꼭 실행되어야 할 경우엔 do~while을 쓰는 걸 고려해볼 수 있다.

 

무한루프 : 정해진 횟수가 아니라, 사용자가 필요한 만큼 실행할 수 있도록 할 수 있다. 말 그대로 무한으로 동작하는 반복문이다.

이 때, 빠져나올 수 있는 길을 만들어 주어야 한다.

while 문의 조건을 1로 입력하면, 이는 항상 참이 되어 무한 반복이 된다. 무한루프에서 나올 수 있도록 도와주는 명령문이 break이다.

 

goto ~ : 조건을 비교하는게 아니라, 지정한 곳으로 곧바로 이동하도록 하는 명령문이다. goto를 사용할 때는 어디로 가야할지 명시해 줄 필요가 있다. 만약 상단에 flag: 라는 코드를 작성하고, 하단에서 goto flag;를 작성한다면, 컴파일러는 goto flag:를 만나면 상단의 flag:라는 지점으로 돌아가서 해당 지점부터 다시 실행하게 된다.

 

문제에서는 while, do~while, for문을 사용할 수 없다고 명시되어 있기 때문에, goto를 이용한다.

 

#include <stdio.h>

int main(){
    int x;
    
    repeat:
    scanf("%d", &x);
    if(x!=0){
        printf("%d \n", x);
        goto repeat;
    }
    
    return 0;
}

 

#1072 정수 입력받아 계속 출력하기

 

사용자가 입력한 횟수만큼 반복하는 법은, 반복할 횟수를 n이라고 할 때, 반복문의 조건식에 (n--)를 넣어주면 된다. n이 1씩 감소하면서 한 번씩 실행되다가 n이 0이 되면 조건식이 거짓이 되어 반복문을 빠져나오게 된다.

#include <stdio.h>

int main(){
    int n, x;
    scanf("%d", &n);
    
    repeat:
    scanf("%d", &x);
    if(n--!=0){
        printf("%d \n", x);
        goto repeat;
    }
    
    return 0;
}

#1073 0 입력될 때까지 무한 출력하기2 

예시는

int n=1; //처음 조건 검사를 넘어가기 위해 0이 아닌 값 입력
while(n!=0)
{
  scanf("%d", &n);
  printf("%d", n);
} 

이렇게 작성되어 있지만 이대로 실행하면 0을 입력하면 0이 그대로 출력되는데, 문제에서의 출력예시에는 0은 출력하지 않는다고 되어있기 때문에 조금 다르게 작성해보았다. 다르게 하는김에 do~while문으로 작성하였다.

 

조건에 상관없이 첫 한번은 무조건 입력을 받아야하기 때문에 do~while도 괜찮을 것 같았다. 우선 n에 정수를 입력 받은 후에 n이 0인지 아닌지 if문을 통해 확인한다. 여기서 if(n!=0)이 아니라 if(n)이라고 작성하였는데, 무한루프를 while(1)로 작성한 것과 같이, 만약 0을 입력해서 n에 0이 저장되었다면, if(0) 은 거짓이 되므로 if문을 실행하지 않고 그대로 넘어가게 된다. 만약 0이 아닌 다른 값이 들어간다면 참으로 처리되어서 n을 출력하게 된다. 아래의 while(n)도 같은 맥락으로, 0이 입력되었으면 조건식이 거짓이 되어서 while문을 빠져나가게 된다.

 

#include <stdio.h>

int main(){
    int n;
    
    do{
        scanf("%d", &n);
        if(n)
            printf("%d\n", n);
    } while(n);
    
    return 0;
}

 

#1074 정수 1개 입력받아 카운트다운 출력하기1

같은 동작을 여러번 실행하기 때문에 반복문을 써야한다. 1까지만 출력하고 0이 되면 반복문을 탈출해야 하므로, 조건을 n으로 작성하고, 출력과 동시에 n을 1감소한 후에 n이 0이 되면 탈출하도록 작성한다.

 

#include <stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    
    while(n){
        printf("%d \n", n--);
    }
    
    return 0;
}

 

 

 

#1075 정수 1개 입력받아 카운트다운 출력하기2

#1074는 n이 입력되면 n부터 1까지 출력이지만, #1075는 n-1 ~ 0까지 출력한다. 단순하게 생각해서 출력에 n--가 아니라 --n을 해주면 된다. 이 때는 반복문의 조건을 n--로 해주고 출력을 n을 해주어도 동일한 결과가 나온다.

 

#include <stdio.h>

int main(){
    int n;
    scanf("%d", &n);
    
    while(n){
        printf("%d \n", --n);
    }
    
    return 0;
}

 

#1076 문자 1개 입력받아 알파벳 출력하기

대소문자 구분할 필요없이 입력예시가 a~z라고 명시되어 있다. 문자형 변수 ch를 'a'로 선언해준 후에 while문을 통해 출력하고 1을 더해주면 된다. 입력 된 알파벳까지 출력해야하므로 조건은 ch<=입력받은변수 가 된다.

 

#include <stdio.h>

int main(){
    char x, ch='a';
    scanf("%c", &x);
    
    while(ch<=x){
        printf("%c ", ch++);
    }
    
    return 0;
}

 

 

#1077 정수 1개 입력받아 그 수까지 출력하기

n부터 1씩 감소하는 형태로 출력하는 방법은 조건에 n을, 출력을 n--로 하면 되지만, 해당 문제는 0부터 n까지 출력해야하기 때문에 변수를 새로 선언하고 0으로 초기화 후에, n보다 작거나 같을 동안 출력을 해주면 된다.

 

#include <stdio.h>

int main(){
    int input, n=0;
    scanf("%d", &input);
    
    while(n<=input){
        printf("%d\n", n++);
    }
    
    return 0;
}

 

#1078 짝수 합 구하기

for문의 기본 구조는

 

for(초기식;조건식;증감식){

    내용

}

 

이다. 초기식에는 초기화 하는 식이 들어간다. 조건식에는 조건이 들어가는데, 조건이 참이면 실행, 거짓이면 for문을 빠져나간다. 증감식은 for문의 조건이 참이고, 내용이 실행된 후에, 어떠한 값을 증가, 감소하는 식이 들어간다.

#1077과 비교해서 보면, 초기식은 n=0, 조건식은 n<=input, 증감식은 출력문에 있는 n++가 된다. #1077을 for문으로 재작성하면

 

for(n=0;n<=input;n++){

    printf("%d\n", n);

}

이 된다.

 

짝수를 모두 더해서 저장할 변수 sum을 선언한 후에 for문 내에서 짝수인지 확인하고 짝수일 경우 sum이라는 변수에 더해주면 된다.

 

#include <stdio.h>

int main(){
    int i, n, sum=0;
    scanf("%d", &n);
    
    for(i=0; i<=n; i++){
        if(i%2==0)
            sum+=i;
    }
    printf("%d", sum);
    
    return 0;
}

 

 

#1079 원하는 문자가 입력될 때까지 반복 출력하기

출력 예시를 보면 q가 입력되어도 출력해준 후에 종료된다. 그렇다면 처음 한번은 q가 입력되든 아니든 무조건 한번은 입력받고 출력해야 하는 경우이기 때문에 do~while이 적합하다고 생각하여 do~while로 작성하였다.

 

처음엔 do~while문 내의 내용을

scanf("%c", &ch);

printf("%c\n", ch);

로 작성하였는데, 제출해보니 틀렸다고 나와서 실제로 작동시켜보니 문자 사이에 줄바꿈이 2번씩 이루어졌다.

왜 그런지 자세히 보니, 문자를 입력받을 때에는 공백도 문자로 인식되는 것 같았다.

그래서 어떻게 처리할 지 생각해보다가 시간을 입력받을 때 ("%d:%d:%d) 처럼 받았던 것을 기억해내고, 

입력 형태에 공백을 넣어줘서 공백을 문자로 처리하지 않게끔 재작성하였다.

 

#include <stdio.h>

int main(){
    char ch;
    
    do{
        scanf("%c ", &ch);
        printf("%c\n", ch);
    } while(ch!='q');
    
    return 0;
}

 

#1080 언제까지 더해야 할까?

for문을 사용할 때, 정해지지 않은 만큼, 얼마나 for문을 반복해야 할지 모를 때, 무한루프처럼 사용하는 방법이 있는데 그 중 하나가 조건식을 생략하는 것이다. 이러한 경우, for문 내에 break 명령어를 넣어주지 않으면 프로그램이 종료되지 않기 때문에 break를 적절히 잘 사용해주어야 한다.

 

#include <stdio.h>

int main(){
    int n, i, sum=0;
    scanf("%d", &n);
    
    for(i=1; ; i++){
        sum+=i;
        if(sum>=n){
            break;
        }
    }
    printf("%d", i);
    return 0;
}