문제

정수 n(0 < n < 1000)과 수의 목록이 주어졌을 때, 목록에 들어있는 수가 n의 배수인지 아닌지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. 다음 줄부터 한 줄에 한 개씩 목록에 들어있는 수가 주어진다. 이 수는 0보다 크고, 10,000보다 작다. 목록은 0으로 끝난다.

출력

목록에 있는 수가 n의 배수인지 아닌지를 구한 뒤 예제 출력처럼 출력한다.

예제 입력 1

3
1
7
99
321
777
0

예제 출력 1

1 is NOT a multiple of 3.
7 is NOT a multiple of 3.
99 is a multiple of 3.
321 is a multiple of 3.
777 is a multiple of 3.

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n, num;

	scanf("%d", &n);

	scanf("%d", &num);
	while(num!=0)
	{
		if(num>=n && num%n==0)
			printf("%d is a multiple of %d.\n", num, n);
		else
			printf("%d is NOT a multiple of %d.\n", num, n);

		scanf("%d", &num);
	}

	return 0;
}
728x90

문제

코이 초등학교에 새로 부임하신 교장 선생님은 어린 학생들의 행복감과 학생들의 성적 차이 관계를 알아보기로 했다. 그래서 이전 성적을 조사하여 학생 들의 시험 점수 차이 변화를 알아보려고 한다.

예를 들어서 2016년 학생 8명의 점수가 다음과 같다고 하자.

27, 35, 92, 75, 42, 53, 29, 87

그러면 가장 높은 점수는 92점이고 가장 낮은 점수는 27점이므로 점수의 최대 차이는 65이다. 한편 2017년 학생 8명의 점수가 다음과 같았다.

85, 42, 79, 95, 37, 11, 72, 32

이때 가장 높은 점수는 95점이고 가장 낮은 점수는 11점이므로 점수의 최대 차이는 84이다.

N명 학생들의 점수가 주어졌을 때, 가장 높은 점수와 가장 낮은 점수의 차이를 구하는 프로그램을 작성하시오

입력

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 학생 수 N이 주어진다. 다음 줄에는 N명의 학생 점수가 공백 하나를 사이에 두고 주어진다.

출력

표준 출력으로 가장 높은 점수와 가장 낮은 점수의 차이를 출력한다.

제한

모든 서브태스크에서 2 ≤ N ≤ 1,000이고 입력되는 학생들의 점수는 0 이상 1,000 이하의 정수이다.

서브태스크 1 (23점)

학생 수가 2명인 경우만 존재한다.

서브태스크 2 (29점)

점수가 낮은 점수부터 높은 점수까지 순서대로 주어진다.

서브태스크 3 (48점)

원래의 제약 조건 이외에 아무 제약 조건이 없다.

예제 입력 1

5
27 35 92 75 42

예제 출력 1

65

예제 입력 2

8
85 42 79 95 37 11 72 32

예제 출력 2

84

더보기

Solution

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

int compare(const void *x,const void *y)
{
	return *(int *)x>*(int *)y?1:*(int *)x==*(int *)y?0:-1;
}

int main(void)
{
	int N, *score=NULL;

	scanf("%d", &N);
	score=(int *)malloc(N*sizeof(int));
	for(int i=0;i<N;i++)
		scanf("%d", &score[i]);

	qsort((void *)score,(size_t)N,sizeof(int),compare);

	printf("%d\n", score[N-1]-score[0]);
	free(score);
	return 0;
}
728x90

문제

정수 B에 0보다 큰 정수인 N을 곱해 정수 A를 만들 수 있다면, A는 B의 배수이다.

예:

  • 10은 5의 배수이다 (5*2 = 10)
  • 10은 10의 배수이다(10*1 = 10)
  • 6은 1의 배수이다(1*6 = 6)
  • 20은 1, 2, 4,5,10,20의 배수이다.

다른 예:

  • 2와 5의 최소공배수는 10이고, 그 이유는 2와 5보다 작은 공배수가 없기 때문이다.
  • 10과 20의 최소공배수는 20이다.
  • 5와 3의 최소공배수는 15이다.

당신은 두 수에 대하여 최소공배수를 구하는 프로그램을 작성 하는 것이 목표이다.

입력

한 줄에 두 정수 A와 B가 공백으로 분리되어 주어진다.

50%의 입력 중 A와 B는 1000(10^3)보다 작다. 다른 50%의 입력은 1000보다 크고 100000000(10^8)보다 작다.

추가: 큰 수 입력에 대하여 변수를 64비트 정수로 선언하시오. C/C++에서는 long long int를 사용하고, Java에서는 long을 사용하시오.

출력

A와 B의 최소공배수를 한 줄에 출력한다.

예제 입력 1

1 1

예제 출력 1

1

예제 입력 2

3 5

예제 출력 2

15

예제 입력 3

1 123

예제 출력 3

123

예제 입력 4

121 199

예제 출력 4

24079

더보기

Solution

#include<stdio.h>

int main(void)
{
	unsigned long long int A, B, lcm;

	scanf("%llu %llu", &A, &B);
	if(A<B)
	{
		lcm=A;
		A=B;
		B=lcm;
	}
	lcm=A;

	while(lcm%B!=0)
		lcm+=A;

	printf("%llu\n", lcm);
	return 0;
}
728x90

문제

JOI군은 카드 게임을 하고 있다. 이 카드 게임은 5회의 게임으로 진행되며, 그 총점으로 승부를 하는 게임이다.

JOI군의 각 게임의 득점을 나타내는 정수가 주어졌을 때, JOI군의 총점을 구하는 프로그램을 작성하라.

입력

표준 입력에서 다음과 같은 데이터를 읽어온다.

  • i 번째 줄(1 ≤ i ≤ 5)에는 정수 Ai가 적혀있다. 이것은 i번째 게임에서의 JOI군의 점수를 나타낸다.

모든 입력 데이터는 다음 조건을 만족한다.

  • 0 ≤ Ai ≤ 100.

출력

표준 출력에 JOI군의 총점을 한 줄로 출력하라.

예제 입력 1

1
2
3
4
5

예제 출력 1

15

예제 입력 2

0
100
0
10
100

예제 출력 2

210

더보기

Solution

#include<stdio.h>

int main(void)
{
	int total=0, score;

	for(int i=0;i<5;i++)
	{
		scanf("%d", &score);
		total+=score;
	}

	printf("%d\n", total);
	return 0;
}
728x90

문제

성원이는 수학을 정말 못 하는 고등학생이다. 수학을 못하는 대신 근성과 팔 힘이 뛰어난 성원이는 수학 시험에서 수학 지식을 사용하지 않고 근성과 체력을 사용해 문제를 푼다. 지난 시험에서는 아래 사진에 나와있는 문제를 근성과 체력을 사용해 열심히 풀었지만 사진에서 볼 수 있듯이 틀려버리고 말았다!

결국 이 문제는 틀려버렸지만 성원이는 여전히 자신의 체력에 강한 자신감을 갖고 있다. 어떤 어려운 문제가 나와도 이런 식으로 근성과 체력을 사용하면 다 풀 수 있으니 이 방법은 최고의 방법이라고 생각하고 있다.

성원이의 친구 형석이는 근성과 체력으로 수학 문제를 푸는 것은 굉장히 무식한 방법이라고 생각한다. 형석이는 수학을 공부하면 문제를 훨씬 빨리 풀 수 있다는 것을 알려주기 위해 위 사진에 나와있는 문제를 갖고 성원이와 퀴즈 내기를 하기로 했다. 위 사진의 문제를 다시 정리하면 아래와 같다.

"한 변의 길이가 1인 정사각형을 아래 그림과 같이 겹치지 않게 빈틈없이 계속 붙여 나간다. 가장 아랫부분의 정사각형이 n개가 되었을 때, 실선으로 이루어진 도형의 둘레의 길이를 구하시오."

가장 아랫부분의 정사각형 개수가 주어지면 그에 해당하는 답을 출력하는 프로그램을 만들어 형석이를 도와주자!

입력

첫 번째 줄에 가장 아랫부분의 정사각형 개수 n이 주어진다. (1 ≤ n ≤ 10^9)

출력

첫 번째 줄에 형석이가 말해야 하는 답을 출력한다.

예제 입력 1

1

예제 출력 1

4

예제 입력 2

3

예제 출력 2

12

더보기

Solution

#include<stdio.h>

int main(void)
{
	unsigned long long int n;

	scanf("%llu", &n);
	printf("%llu\n", 4*n);

	return 0;
}
728x90

문제

상근이는 2863번에서 표를 너무 열심히 돌린 나머지 5와 6을 헷갈리기 시작했다.

상근이가 숫자 5를 볼 때, 5로 볼 때도 있지만, 6으로 잘못 볼 수도 있고, 6을 볼 때는, 6으로 볼 때도 있지만, 5로 잘못 볼 수도 있다.

두 수 A와 B가 주어졌을 때, 상근이는 이 두 수를 더하려고 한다. 이때, 상근이가 구할 수 있는 두 수의 가능한 합 중, 최솟값과 최댓값을 구해 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 두 정수 A와 B가 주어진다. (1 <= A,B <= 1,000,000)

출력

첫째 줄에 상근이가 구할 수 있는 두 수의 합 중 최솟값과 최댓값을 출력한다.

예제 입력 1

1430 4862

예제 출력 1

6282 6292

더보기

Solution

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

int main(void)
{
	int A, B, min[2], max[2];
	char num[10]={'\0', };

	scanf("%d %d", &A, &B);

	sprintf(num,"%d", A);
	for(int i=0;i<strlen(num);i++)
		num[i]+=num[i]=='5';
	max[0]=atoi(num);
	for(int i=0;i<strlen(num);i++)
		num[i]-=num[i]=='6';
	min[0]=atoi(num);

	for(int i=0;i<10;i++)
		num[i]='\0';
	sprintf(num,"%d", B);
	for(int i=0;i<strlen(num);i++)
		num[i]+=num[i]=='5';
	max[1]=atoi(num);
	for(int i=0;i<strlen(num);i++)
		num[i]-=num[i]=='6';
	min[1]=atoi(num);

	printf("%d %d\n", min[0]+min[1], max[0]+max[1]);
	return 0;
}
728x90

문제

        7
      3  8
    8  1  0
  2  7  4  4
4  5  2  6  5

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

입력

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

예제 입력 1

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

예제 출력 1

30

더보기

Solution

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

int main(void)
{
	int n, **triangle=NULL, **max=NULL, max_number;

	scanf("%d", &n);
	triangle=(int **)malloc(n*sizeof(int *));
	for(int i=0;i<n;i++)
		triangle[i]=(int *)malloc((i+1)*sizeof(int));
	max=(int **)malloc(n*sizeof(int *));
	for(int i=0;i<n;i++)
		max[i]=(int *)calloc(i+1,sizeof(int));

	for(int i=0;i<n;i++)
		for(int j=0;j<=i;j++)
			scanf("%d", &triangle[i][j]);

	max[0][0]=triangle[0][0];
	for(int i=1;i<n;i++)
	{
		max[i][0]=max[i-1][0]+triangle[i][0];
		max[i][i]=max[i-1][i-1]+triangle[i][i];
	}
	for(int i=1;i<n;i++)
		for(int j=1;j<i;j++)
			max[i][j]=triangle[i][j]+(max[i-1][j-1]>max[i-1][j]?max[i-1][j-1]:max[i-1][j]);
	max_number=max[n-1][0];
	for(int i=1;i<n;i++)
		max_number=max[n-1][i]>max_number?max[n-1][i]:max_number;

	printf("%d\n", max_number);
	for(int i=0;i<n;i++)
		free(max[i]);
	free(max);
	for(int i=0;i<n;i++)
		free(triangle[i]);
	free(triangle);
	return 0;
}
728x90

문제

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

출력

예제와 같이 요세푸스 순열을 출력한다.

예제 입력 1

7 3

예제 출력 1

<3, 6, 2, 7, 5, 1, 4>

더보기

Solution

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

int main(void)
{
	int N, K, front=0, rear, *Y=NULL;

	scanf("%d%d", &N, &K);
	Y=(int *)malloc(N*sizeof(int));

	for(rear=0;rear<N;rear++)
		Y[rear]=rear+1;

	printf("<");
	for(int n=0;n<N;n++)
	{
		for(int k=1;k<K;k++)
			Y[(rear++)%N]=Y[(front++)%N];
		printf("%d", Y[(front++)%N]);
		printf("%s", n==N-1?">":", ");
	}

	free(Y);
	return 0;
}
더보기

Solution

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb=new StringBuilder();

		StringTokenizer st=new StringTokenizer(br.readLine());
		int N=Integer.parseInt(st.nextToken()), K=Integer.parseInt(st.nextToken()), front=0, rear;
		int[] Y=new int[N];
		
		for(rear=0;rear<N;rear++)
			Y[rear]=rear+1;
		sb.append("<");
		for(int n=0;n<N;n++) {
			for(int k=1;k<K;k++)
				Y[(rear++)%N]=Y[(front++)%N];
			sb.append(Y[(front++)%N]);
			sb.append(n==N-1?">":", ");
		}
		
		System.out.println(sb.toString());
	}
}

 

728x90

+ Recent posts