구매한 물건의 종류의 수 N만큼 반복하며 각 물건의 가격 a, 와 개수 b 곱을 총금액 cost에 더한다.
그럼, cost에는 구매한 물건의 가격과 개수로 계산한 총금액 값이 들어있게 된다.
이때 영수증에 적힌 총금액 X와 비교하여 일치하면 Yes, 일치하지 않으면 No를 출력하면 된다.
#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;
}
int 앞에 long의 개수가 하나씩 더 붙일 때마다 4바이트씩 저장할 수 있는 공간이 늘어난다. 정수 N은 4의 배수이므로 간단하게 N을 4로 나눈 몫만큼 long을 출력하면 된다.
그 이후 int를 출력하면 성공이다.
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n / 4; i++) {
printf("long ");
}
printf("int");
return 0;
}
바구니의 번호를 배열의 인덱스 번호로 세팅해주고 가장 처음 바구니에는 공이 들어 있지 않으므로, 0으로 모두 초기화 시켜준다.
이후 i~j 바구니에 k번 번호가 적혀 있는 공을 넣고 이미 공이 있는 경우 새것으로 교체해주므로 반복문을 사용하여 i~j인덱스에 k를 넣어주면 된다.
그 이후 1번 바구니부터 N번 바구니까지 출력해주면 된다.
#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;
}
10810문제와 같이 바구니의 번호를 인덱스로 세팅해주고 처음 바구니에 적혀있는 번호가 적힌 공을 가지고 있으므로 자신의 번호로 배열 초기화해준다.
그 이후 M번 i, j 인덱스의 있는 공을 바꾸는 알고리즘을 구현하면 된다.
#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;
}
총 30명의 학생이 있으므로 배열의 인덱스의 값을 출석번호로 세팅해주고 출석 여부를
0(결석)과 1(출석)로 하기 위해 처음 배열을 0으로 초기화 시켜준다.
그 이후 반복문을 돌리며 나온 번호를 출석으로 바꾸어준 후 마지막에 결석(0)한 번호를 출력해주면 된다.
#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;
}
수 10개를 입력받은 뒤, 이름 42로 나눈 나머지 중 서로 다른 값의 개수를 구하는 문제이므로 처음 수를 입력받을 때 42로 나누어 저장한다. 서로 다른 값의 개수를 구하는 문제이므로 같은 값이 몇 개 있는지 알 필요가 없다. 따라서, cnt값을 사용하여 같은 수가 있는지 비교하고 있다면 result를 1씩 증가시킨다.
이후 result의 값을 출력하면 성공할 수 있다.
#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;
}
N(1 <= N <= 100)의 범위에 맞게 배열을 선언해주고 각 인덱스의 번호를 바구니의 번호로 초기화 시켜준다.
그 이후 reverse 함수를 따로 제작하여 i, j를 파라미터로 넘겨주었을 때 i~j까지 바구니의 순서를 역순으로 만들어 준다.
l은 간단하게 바꿔야 하는 바구니 개수이고 cnt값을 따로 정의하여 편리하게 역순으로 만들어 주었다. reverse 함수를 구현할 때 많은 시행착오가 있어 시간을 많이 소비했다.
c++이 얼마나 편리한지 한 번 더 깨닫게 되는 경험이었다.
#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;
}
출력 예제를 확인하였을 때 실수로 출력되므로 double형을 사용하였다.
입력과 동시에 최댓값을 구해주고 세준이가 정의한 새로운 평균 시스템을 이용하여 평균값을 구해주면 된다.
#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;
}
행렬의 덧셈은 a[i][j] + b[i][j] 이므로 입력받음과 동시에 더해주면 편하다.
모든 배열을 0으로 초기화 시켜주고 반복문을 두 번 사용하여 한 배열에 행렬의 덧셈을 표현해주면 된다.
#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;
}
문자열을 5줄 입력받고 최대 15개의 글자가 빈칸 없이 연속으로 주어지므로
arr[5][15]로 선언해준다. 전역변수로 선언하면 자동으로 배열을 초기화해주므로 따로 초기화해주지 않아도 된다.
그 이후 세로로 문자를 출력하고 null과 같으면 continue 해준다.
#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;
}
띄어쓰기가 있는 문자열을 입력받는 방법을 구글링통해 알아내었다.
%[^\n]s 식으로 입력받으면 '\n' 즉 enter가 입력되기 전까지 입력받게 된다.
이를 사용하여 한 줄을 입력받고 (띄어쓰기 개수) + 1이 단어의 개수이므로 처음 cnt를 1로 선언해줬다. 띄어쓰기가 맨 앞, 뒤에 붙을 수 있으므로 검사해서 띄어쓰기가 있다면 cnt를 1씩 감소시켜 단어의 개수를 구할 수 있다.
#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;
}
세 자릿수 두개를 입력해주기 때문에 문자열로 받게 되면 쉽게 자릿수를 이용하여 문제를 풀 수 있다. 세 자릿수 숫자의 대소비교를 하기 위해서는 100 -> 10 -> 1 자리 순으로 비교하므로 역순을 비교에선 1 -> 10 -> 100 순으로 자릿수를 비교하기 때문에
큰 값을 check에 넣어주고 역순으로 출력해주면 된다.
#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;
}
n줄까지 공백의 개수가 n-1부터 1씩 줄어들고 별의 개수가 n*1-1가 된다.
n줄 이후부터는 공백의 개수가 1씩 증가하고 별의 개수가 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;
}
n번 라인까지 별을 줄 번호의 개수로 출력한 후 공백을 n2에서 -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+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;
}
2443 별 찍기-6번 같이 거꾸로 피라미드를 출력해준 후 첫 줄을 제외한 피라미드를 출력해주면 된다. n번 라인까지 별의 공백 개수가 1씩 늘어나고 별의 개수가 2개씩 감소한다. n번 라인이 후 별의 공백 개수가 1씩 감소하고 별의 개수가 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;
}
공백의 개수가 n번 라인까지 n-1에서 1씩 감소하고 별의 개수가 1씩 증가한다.
이후 n번 라인 이후 공백의 개수가 1씩 증가하고 별의 개수가 1씩 감소하면 된다.
별 찍기-8, 9 보다 쉬운 문제인 것 같다.
#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;
}