728x90
문제설명

평가를 문자(A, B, C, D, ...)로 입력받아 내용을 다르게 출력해보자.

평가 내용
평가 : 내용
A : best!!!
B : good!!
C : run!
D : slowly~
나머지 문자들 : what?


참고
조건/선택문을 복합적으로 구성해 출력할 수도 있지만,

switch(정수값)
{
  case 'A': //문자 'A'가 정수값 65('A'의 아스키 값)로 저장되기 때문에 가능하다.
    ...;
    break;
  case 'B':
    ...;
    break;
  case 'C':
    ...;
    break;
  default:
    ...;
}

위와 같은 switch( ) ... case... break; 제어문을 사용할 수 있다.

** break; 를 사용하지 않으면 이후의 명령들도 계속 실행된다.
default: 는 제시된 case 를 제외한 나머지 모든 경우에 실행된다.
switch( ) 에 주어지는 값은 “정수"값만 가능하며,
문자도 아스키코드 정수값이기 때문에 가능하다.

 

 

입력

영문자 1개가 입력된다.
(A, B, C, D 등의 한 문자가 입력된다.)

 

 

출력

평가내용에 따라 다른 내용이 출력된다.

 

 

입력예시

A

 

 

출력예시

best!!!

 


#include <stdio.h>
int main(void){
    char n;
    scanf("%c", &n);
    switch(n){
        case 'A':
        printf("best!!!");
        break;
        case 'B':
        printf("good!!");
        break;
        case 'C':
        printf("run!");
        break;
        case 'D':
        printf("slowly");
        break;
        default:
        printf("what?");
    }
}

이 문제는 크게 어려움이 있지는 않지만 평소에 잘 쓰지 않는 부분이 있어 기록하려고 작성해본다. 여기서 처음에 switch 안에서 정수형을 넣어야 된다고 해서 처음에는 int 형과 %d를 활용했다. 하지만 이것은 아니였다 switch 하는 과정에서 알아서 아스키 코드로 변환하여 하기에 문자열로 입력을 받고 저장해야 하는 것이 맞다. 그리고 case 부분에 줄 들여쓰기가 안되길래 잘못한줄 알았는데 아니였다. case로 알아서 찾아 들어가기 때문에 걱정안하고 해도 된다. 각각 출력해야할 것을 넣어주고 break;로 마무리해주면 된다. else처럼의 역할은 default이다. 다른 것을 입력안하고 default: 이 형태로만 해줘도 된다.

728x90
728x90
문제 설명

프로그래밍 문제를 풀다 보면 뒤죽박죽인 N개의 데이터를 숫자의 크기 순으로 0 ~ N-1까지의 숫자로 재정렬 해야되는 경우가 종종 있다.

예를 들어 N=5 이고,

50 23 54 24 123

이라는 데이터가 있다면,

2 0 3 1 4

가 된다.

데이터를 재정렬하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 데이터의 개수 N이 입력된다. ( 1 <= N <= 50,000)

둘째 줄에 공백으로 분리되어 N개의 서로 다른 데이터가 입력된다. (값의 범위:0~500,000)

 

 

출력

N개의 데이터를 0 ~ N-1로 재정렬하여 출력하라.

 

 

입력 예시

5

50 23 54 24 123

 

 

 

출력 예시

2 0 3 1 4

 

 

도움말

50 23 54 24 123 에서

23, 24, 50, 54, 123 순서로 0, 1, 2, 3, 4 가 된다.

그리고 원래의 위치대로 출력한다.


#include <stdio.h>
#include <stdlib.h>

int main(void){
    int n,count=0;
    scanf("%d", &n);
    int *arr1=(int*)malloc(n*sizeof(int));
    int *arr2=(int*)malloc(500000*sizeof(int));

    for(int i=0;i<n;i++){
        scanf("%d", &arr1[i]);
        ++arr2[arr1[i]];
    }
    for(int i=0;i<500000;++i){
        if(arr2[i]>0){
            arr2[i]=count++;
        }
    }
    for(int i=0;i<n;i++){
        printf("%d ",arr2[arr1[i]]);
    }
    free(arr1);
    free(arr2);

    return 0;
}

이 문제는 코드를 결국 가져와서 하나 하나 분석해보도록 하겠다.

 

처음에 나는 이 문제를 보았을 때 배열로 풀수 있을 것이라고 생각했다. 하지만 잘 되지 않았다. 무언가가 꼬였다. 순서를 바꾸긴 하더라도 이것을 다시 원래 대로 어떻게 확인하고 출력을 할것인지가 문제였다. 그래서 한번 어떻게 하는지 보았는데 내가 본 코드는 메모리 할당이었다. 배열을 가지고 오긴 하지만 메모리할당을 통해서 만드는 것이었다. 메모리 할당, 이제 개념과 어떻게 해야하는지는 감이 오는데 언제 써야 하는지 잘 모르겠다.

 

코드를 뜯어보자면

일단 몇번 반복할 것인지 저장해주는 것은 크게 다르지 않다.

그리고 이제 메모리 할당을 위한 작업이 필요하다.

포인터를 이용하는 것은 메모리 할당을 알게 되면 이해가 된다.

일단 arr1은 자리 숫자를 위한 작업이고 arr2는 아무래도 값의 범위를 나타내는 것이라고 할 수 있을 것이다. 모두 숫자이므로 int형 만큼 자리 확보가 필요하다. 그 다음에 for문을 이용하는데 arr1에 값을 각각 저장하는 것은 쉽게 알 수 있다. 그 다음에 arr2에 그 숫자로 위치를 넣어준다. 

다음 for문을 해보도록 하겠다. 이제는 전체 범위에서 봐주는 작업이 필요하다. 값이 넣어진 자리는 0보다 클 것이므로 여기에 count를 해준다. 이게 왜 등장하는지 의문이 처음엔 들기도 했는데 이 원리는 다음과 같다.

이제 처음 변수가 선언되었을 때에는 0이다. 그리고 이제 첫번째로 i자리에서는 count가 1번 되어서 더해지게 된다. count는 계속 초기화가 아니라 계속 누적이 되게 된다. 다음 숫자를 만났을 때에는 2가 되고 그 다음 숫자를 만나면 3 이렇게 누적이 되게 된다. 

마지막 for문에서는 최종 출력 과정이다. 저장 방식과 마찬가지로 출력을 해야 한다. 이것을 이해하는데에는 어려움이 크게 되지 않는다. 자릿수가 있기 때문이다.

마지막에 메모리 할당 해제를 해주고 반환하면 끝이다.

 

728x90
728x90
문제설명

입체기동장치 생산공장에서는 거인들을 물리치기 위한 기계가 생산되고 있습니다.

이 공장을 운영하는 에렌은 입체기동장치(1~100)의 식별번호(1~100)와 가스 보유량(0~10000)을 같이 관리하려고 합니다.

하지만, 식별번호를 정렬할 때 가스 보유량이 뒤죽박죽 되어 버려 골머리를 앓고 있습니다.

에렌을 남몰래 좋아하고 있던 미카사는 에렌이 스트레스성 탈모로 잔머리가 모두 빠지기 전에 이 문제를 해결해주려 합니다.

미카사가 에렌의 스트레스성 탈모를 막을 수 있도록 프로그램을 작성해세요.

식별번호가 한번 정해지면 그 입체기동장치의 가스 보유량은 정렬되더라도 변하지 않아야 합니다.

 

 

입력

첫째 줄에 입체기동장치의 갯수 n이 입력된다. (1 <= n <= 100)

둘째 줄부터 n+1째 줄까지 각 줄에 입체기동장치의 식별번호 a와 가스 보유량 b가 주어진다.

a는 중복 될 수 없지만 b는 중복될 수 있다. (1 <= a <= 100), (0 <= b <= 10,000)

 

 

출력

첫째 줄부터 n번째 줄까지 각 줄에 식별번호를 오름차순으로 정렬해 가스 보유량과 같이 출력한다.

 

 

입력예시

3

2 10

3 20

1 30

 

출력예시

1 30

2 10

3 20

 


#include <stdio.h>
int main(void){
    int n;
    int a[101],b[10001];
    int temp;
    scanf("%d", &n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&a[i],&b[i]);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(a[i]<a[j]){
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                temp=b[i];
                b[i]=b[j];
                b[j]=temp;

            }
        }
    }
    for(int i=0;i<n;i++){
        printf("%d %d \n", a[i],b[i]);
    }
    return 0;
    
}

처음에는 구조체 문제라고 해서 struct를 써야 되나 해서 굉장히 고민이 많았던 문제였다. 찾아보니 그건 아니여서 기존에 풀던 방식을 유지했다. 아직 헷갈리는게 비교하는 과정에서 for문 중첩이 가장 안 익숙해지는 것 같긴하다. 원리를 이해 못한듯하다. 안에서 옮겨주고 또한번 더 검사를 해서 그런지 몰라도 확신은 들지 않지만 이 방법이 낫기에 따라가는중... temp로 값 만들어주는 것은 어렵지 않다. 여기서는 두값을 동시에 옮겨야 하므로 if문 안에서는 a만 확인하고 바꾸는 것은 a와 b 각각 옮겨주면된다. 출력은 어렵지 않으니까.......

반환도 해주고......

728x90

+ Recent posts