Layer7 C Programming 1차시

Kioreo·2023년 4월 4일
0

Layer7

목록 보기
1/5

25304 : 영수증

1. 풀이

구매한 물건의 종류의 수 N만큼 반복하며 각 물건의 가격 a, 와 개수 b 곱을 총금액 cost에 더한다.
그럼, cost에는 구매한 물건의 가격과 개수로 계산한 총금액 값이 들어있게 된다.
이때 영수증에 적힌 총금액 X와 비교하여 일치하면 Yes, 일치하지 않으면 No를 출력하면 된다.

2. 코드

#include <stdio.h>

int main()
{
	int X, N, a, b, cost = 0;

	scanf("%d\n%d", &X, &N);

	for (int i = 0; i < N; i++) {
		scanf("%d %d", &a, &b);
		
		hap += (a * b);
	}

	if (X == hap) {
		printf("Yes");
	}else{
		printf("No");
    }

	return 0;
}

알고리즘 분류

  • 수학
  • 구현
  • 사칙연산

25314 : 코딩은 체육과목 입니다

1. 풀이

int 앞에 long의 개수가 하나씩 더 붙일 때마다 4바이트씩 저장할 수 있는 공간이 늘어난다. 정수 N은 4의 배수이므로 간단하게 N을 4로 나눈 몫만큼 long을 출력하면 된다.
그 이후 int를 출력하면 성공이다.

2. 코드

#include <stdio.h>

int main() {

    int n;
    
    scanf("%d", &n);
    
    for(int i = 0; i < n / 4; i++) {
        printf("long ");
    }
    printf("int");

    return 0;
}

알고리즘 분류

  • 구현

10810 : 공 넣기

1. 풀이

바구니의 번호를 배열의 인덱스 번호로 세팅해주고 가장 처음 바구니에는 공이 들어 있지 않으므로, 0으로 모두 초기화 시켜준다.
이후 i~j 바구니에 k번 번호가 적혀 있는 공을 넣고 이미 공이 있는 경우 새것으로 교체해주므로 반복문을 사용하여 i~j인덱스에 k를 넣어주면 된다.
그 이후 1번 바구니부터 N번 바구니까지 출력해주면 된다.

2. 코드

#include <stdio.h>

int main() {
  int arr[101] = { 0, };
  int N, M, i, j, k;

  scanf("%d %d", &N, &M);

  for (int l = 0; l < M; l++) {
    scanf("%d %d %d", &i, &j, &k);
    for (int m = i; m <= j; m++) {
      arr[m] = k;
    }
  }

  for (int l = 1; l < N + 1; l++) {
    printf("%d ", arr[l]);
  }

  return 0;
}

알고리즘 분류

  • 구현
  • 시뮬레이션

10813 : 공 바꾸기

1. 풀이

10810문제와 같이 바구니의 번호를 인덱스로 세팅해주고 처음 바구니에 적혀있는 번호가 적힌 공을 가지고 있으므로 자신의 번호로 배열 초기화해준다.
그 이후 M번 i, j 인덱스의 있는 공을 바꾸는 알고리즘을 구현하면 된다.

2. 코드

#include <stdio.h>

int main() {
  int arr[101];
  int N, M, tmp, j, k;

  scanf("%d %d", &N, &M);
  
  for (int i = 1; i < N + 1; i++) {
    arr[i] = i;
  }

  for(int i = 0; i < M; i++){
    scanf("%d %d", &j, &k);
    tmp = arr[j];
    arr[j] = arr[k];
    arr[k] = tmp;
  }

  for(int i = 1 ; i < N+1; i++){
    printf("%d ", arr[i]);
  }
  
  return 0;
}

알고리즘 분류

  • 구현
  • 시뮬레이션

5597 : 과제 안 내신 분..?

1. 풀이

총 30명의 학생이 있으므로 배열의 인덱스의 값을 출석번호로 세팅해주고 출석 여부를
0(결석)과 1(출석)로 하기 위해 처음 배열을 0으로 초기화 시켜준다.
그 이후 반복문을 돌리며 나온 번호를 출석으로 바꾸어준 후 마지막에 결석(0)한 번호를 출력해주면 된다.

2. 코드

#include <stdio.h>
#define MAX 31

int main() {
    int a[MAX] = { 0, };
    int idx = 0;
    for(int i = 1; i < MAX-2; i++){
        scanf("%d", &idx);
        a[idx]++;
    }
    
    for(int i = 1; i < MAX; i++){
        if(a[i] != 1){
            printf("%d\n", i);
        }
    }
    
    return 0;
}

알고리즘 분류

  • 구현

3052 : 나머지

1. 풀이

수 10개를 입력받은 뒤, 이름 42로 나눈 나머지 중 서로 다른 값의 개수를 구하는 문제이므로 처음 수를 입력받을 때 42로 나누어 저장한다. 서로 다른 값의 개수를 구하는 문제이므로 같은 값이 몇 개 있는지 알 필요가 없다. 따라서, cnt값을 사용하여 같은 수가 있는지 비교하고 있다면 result를 1씩 증가시킨다.
이후 result의 값을 출력하면 성공할 수 있다.

2. 코드

#include <stdio.h>

int main() {
    int arr[10] = { 0, };


    for (int i = 0; i < 10; i++) {
        int N;
        scanf("%d", &N);
        arr[i] = N % 42;
    }

    int cnt = 10;

    for (int i = 0; i < 9; i++) {
        int num = -1;
        for (int j = (i + 1); j < 10; j++) {
            if (num == arr[j]) {
                cnt++;
            }

            if (arr[i] == arr[j]) {
                num = arr[i];
                cnt--;
            }            
        }
    }

    printf("%d", cnt);

    return 0;
}

알고리즘 분류

  • 수학
  • 사칙연산

10811 : 바구니 뒤집기

1. 풀이

N(1 <= N <= 100)의 범위에 맞게 배열을 선언해주고 각 인덱스의 번호를 바구니의 번호로 초기화 시켜준다.
그 이후 reverse 함수를 따로 제작하여 i, j를 파라미터로 넘겨주었을 때 i~j까지 바구니의 순서를 역순으로 만들어 준다.
l은 간단하게 바꿔야 하는 바구니 개수이고 cnt값을 따로 정의하여 편리하게 역순으로 만들어 주었다. reverse 함수를 구현할 때 많은 시행착오가 있어 시간을 많이 소비했다.
c++이 얼마나 편리한지 한 번 더 깨닫게 되는 경험이었다.

2. 코드

#include <stdio.h>

int arr[101];
int N, M;

void reverse(int i, int j) {
    int tmp, cnt = 0;
    
    int l = (j - i + 1) / 2;
    for (int k = i; k < i + l; k++) {
        tmp = arr[k];
        arr[k] = arr[j - cnt];
        arr[j - cnt] = tmp;
        cnt++;
    }
}

int main() {
    int  j, k;
    scanf("%d %d", &N, &M);

    for (int i = 1; i < N + 1; i++) {
        arr[i] = i;
    }

    for (int i = 0; i < M; i++) {
        scanf("%d %d", &j, &k);
        reverse(j, k);
    }

    for (int i = 1; i < N + 1; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

알고리즘 분류

  • 구현
  • 시뮬레이션

1546 : 평균

1. 풀이

출력 예제를 확인하였을 때 실수로 출력되므로 double형을 사용하였다.
입력과 동시에 최댓값을 구해주고 세준이가 정의한 새로운 평균 시스템을 이용하여 평균값을 구해주면 된다.

2. 코드

#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N);

    double arr[N];
    double max = 0;
    for (int i = 0; i < N; i++) {
        scanf("%lf", &arr[i]);
        if (arr[i] > max) {
            max = arr[i];
        }
    }

   double sum = 0;

    for (int i = 0; i < N; i++) {
        sum = sum + ((arr[i] / max) * 100);
    }

    printf("%lf", (sum / N));

    return 0;
}

알고리즘 분류

  • 수학
  • 사칙연산

2738 : 행렬 덧셈

1. 풀이

행렬의 덧셈은 a[i][j] + b[i][j] 이므로 입력받음과 동시에 더해주면 편하다.
모든 배열을 0으로 초기화 시켜주고 반복문을 두 번 사용하여 한 배열에 행렬의 덧셈을 표현해주면 된다.

2. 코드

#include <stdio.h>

int main() {
  int arr[101][101] = { 0, };
  int N, M,tmp;

  scanf("%d %d", &N, &M);

  for(int i = 1; i < N+1; i++){
    for(int j = 1; j < M+1; j++){
      scanf("%d", &tmp);
      arr[i][j] += tmp;
    }
  }
  
  for(int i = 1; i < N+1; i++){
    for(int j = 1; j < M+1; j++){
      scanf("%d", &tmp);
      arr[i][j] += tmp;
    }
  }

  for(int i = 1; i < N+1; i++){
    for(int j = 1; j < M+1; j++){
      printf("%d ",arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}

알고리즘 분류

  • 수학
  • 구현

10798 : 세로읽기

1. 풀이

문자열을 5줄 입력받고 최대 15개의 글자가 빈칸 없이 연속으로 주어지므로
arr[5][15]로 선언해준다. 전역변수로 선언하면 자동으로 배열을 초기화해주므로 따로 초기화해주지 않아도 된다.
그 이후 세로로 문자를 출력하고 null과 같으면 continue 해준다.

2. 코드

#include <stdio.h>

char arr[5][15];

int main() {
    
    
	int i, j;

	for(i=0; i<5; i++) {
		scanf("%s", arr[i]);
	}

	for(j=0; j<MAX_SIZE; j++) {
		for(i=0; i<5; i++) {
			if(arr[i][j] == NULL)
				continue;
			printf("%c", arr[i][j]);
		}
	}
	return 0;
}

알고리즘 분류

  • 구현
  • 문자열

1152 : 단어의 개수

1. 풀이

띄어쓰기가 있는 문자열을 입력받는 방법을 구글링통해 알아내었다.
%[^\n]s 식으로 입력받으면 '\n' 즉 enter가 입력되기 전까지 입력받게 된다.
이를 사용하여 한 줄을 입력받고 (띄어쓰기 개수) + 1이 단어의 개수이므로 처음 cnt를 1로 선언해줬다. 띄어쓰기가 맨 앞, 뒤에 붙을 수 있으므로 검사해서 띄어쓰기가 있다면 cnt를 1씩 감소시켜 단어의 개수를 구할 수 있다.

2. 코드

#include <stdio.h>
#include <string.h>

int main() {
	char s[1000001];
	int cnt = 1;
	scanf("%[^\n]s", s);

	for (int i = 0; i < strlen(s); i++) {
		if (s[i] == ' ') {
			cnt++;
		}
	}
	if (s[0] == ' ') {
		cnt--;
	}
	if (s[strlen(s) - 1] == ' ') {
		cnt--;
	}

	printf("%d", cnt);

	return 0;
}

알고리즘 분류

  • 구현
  • 문자열

2908 : 상수

1. 풀이

세 자릿수 두개를 입력해주기 때문에 문자열로 받게 되면 쉽게 자릿수를 이용하여 문제를 풀 수 있다. 세 자릿수 숫자의 대소비교를 하기 위해서는 100 -> 10 -> 1 자리 순으로 비교하므로 역순을 비교에선 1 -> 10 -> 100 순으로 자릿수를 비교하기 때문에
큰 값을 check에 넣어주고 역순으로 출력해주면 된다.

2. 코드

#include <stdio.h>
#include <string.h>

int main() {
	char a[4], b[4];
	char check;
	scanf("%s %s", &a, &b);


	for (int i = 2; i >= 0; i--) {
		if (a[i] > b[i]) {
			check = 'a';
			break;
		}
		else if (a[i] < b[i]) {
			check = 'b';
			break;
		}
		else {
			continue;
		}
	}
	if (check == 'a') {
		for (int i = 2; i >= 0; i--) {
			printf("%c", a[i]);
		}
	}
	else {
		for (int i = 2; i >= 0; i--) {
			printf("%c", b[i]);
		}
	}
	
	return 0;
}

알고리즘 분류

  • 구현
  • 수학

2444 : 별찍기-7

1. 풀이

n줄까지 공백의 개수가 n-1부터 1씩 줄어들고 별의 개수가 n*1-1가 된다.
n줄 이후부터는 공백의 개수가 1씩 증가하고 별의 개수가 2개씩 줄어든다.
위와 같은 풀이를 삼중 반복문 두개를 이용하여 아래와 같이 풀이할 수 있다.

2. 코드

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
          printf(" ");
        }
        for (int k = 0; k < 2 * i + 1; k++) {
          printf("*");
        }
        printf("\n");
    }
    
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
          printf(" ");
        }
        for (int k = 2 * n - 1; k > 2 * i; k--) {
          printf("*");
        }
        printf("\n");
    }
    
	return 0;
}

알고리즘 분류

  • 구현

2445 : 별찍기-8

1. 풀이

n번 라인까지 별을 줄 번호의 개수로 출력한 후 공백을 n2에서 -2(라인)만큼 빼주고 다시 별을 줄 번호의 개수로 출력해주면 된다.
n 이후 줄부턴 다시 별의 개수가 1씩 줄어들고 공백의 개수가 -2가 된다.
따라서 아래와 같이 사중 반복문 2개를 사용하여 아래와 같이 풀이할 수 있다.

2. 코드

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i+1; j++) {
          printf("*");
        }
        for (int k = 0; k < 2*(n - i - 1); k++) {
          printf(" ");
        }
        for (int l = 0; l < i+1 ; l++) {
          printf("*");
        }
        printf("\n");
    }
    
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < (n - i - 1); j++) {
          printf("*");
        }
        for (int k = 0; k < 2*(i+1); k++) {
          printf(" ");
        }
        for (int l = 0; l < (n - i - 1) ; l++) {
          printf("*");
        }
        printf("\n");
    }
    
	return 0;
}

알고리즘 분류

  • 구현

2446 : 별찍기-9

1. 풀이

2443 별 찍기-6번 같이 거꾸로 피라미드를 출력해준 후 첫 줄을 제외한 피라미드를 출력해주면 된다. n번 라인까지 별의 공백 개수가 1씩 늘어나고 별의 개수가 2개씩 감소한다. n번 라인이 후 별의 공백 개수가 1씩 감소하고 별의 개수가 2개씩 증가한다.

2. 코드

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < i; j++) {
		    printf(" ");
		}
		
	    for(int k = 0; k < 2*(n-i)-1; k++){
		    printf("*");
		}

		printf("\n");
	}
	
	for(int i = n-1; i > 0; i--){
	    for(int j = 0; j < i-1; j++){
	        printf(" ");
	    }
	    for(int k = 0; k < (n-i)*2+1; k++){
	        printf("*");
	    }
	    printf("\n");
	}
	return 0;
}

알고리즘 분류

  • 구현

2522 : 별찍기-12

1. 풀이

공백의 개수가 n번 라인까지 n-1에서 1씩 감소하고 별의 개수가 1씩 증가한다.
이후 n번 라인 이후 공백의 개수가 1씩 증가하고 별의 개수가 1씩 감소하면 된다.
별 찍기-8, 9 보다 쉬운 문제인 것 같다.

2. 코드

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
        for(int j = 0; j < n-i-1; j++){
            printf(" ");
        }
        for(int k = 0; k < i+1; k++){
            printf("*");
        }
        printf("\n");
	}
	
	for(int i = 0; i < n-1; i++){
	    for(int j = 0; j < i+1; j++){
	        printf(" ");
	    }
	    for(int k = 0; k < n-i-1; k++){
	        printf("*");
	    }
	    printf("\n");
	}
	
	return 0;
}

알고리즘 분류

  • 구현
profile
KITRI BoB 12th, Layer7 23rd

0개의 댓글