문제 

옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.

길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.

S = A[0]×B[0] + ... + A[N-1]×B[N-1]

S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.

S의 최솟값을 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.

 

출력 

첫째 줄에 S의 최솟값을 출력한다.

 

예제

입력:

5
1 1 1 6 0
2 7 8 3 1

출력

18

 

 

코드

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
let total = input.shift(); 
let result = 0;

let arrayA = input[0].trim().split(' ').sort((a, b)=> a-b);
let arrayB = input[1].trim().split(' ');

for(let i=0; i<total; i++) {
    let maxNum = Math.max(...arrayB);
    result += maxNum*arrayA[i];
    arrayB.splice(arrayB.indexOf(maxNum.toString()), 1);
}

console.log(result);

 

 

 

문제 

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

 

출력 

첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

 

예제1 

입력:

10 4200
1
5
10
50
100
500
1000
5000
10000
50000

출력

6

 

예제2 

입력:

10 4790
1
5
10
50
100
500
1000
5000
10000
50000

출력

12

 

 

코드

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n'); 
let money = input.shift().trim().split(' '); 
let count = 0;

for(let i=money[0]-1; i>=0; i--) {
    if(money[1]/input[i]>0) {
        count += parseInt(money[1]/input[i]);
        money[1] %= input[i];
    }
} 

console.log(count);



'Coding > BaekJoon' 카테고리의 다른 글

[BaekJoon/JavaScript] 1475. 방 번호  (0) 2021.10.06
[BaekJoon/JavaScript] 1026. 보물  (0) 2021.10.05
[BaekJoon/C#] 15649. N과 M (1)  (0) 2021.10.03
[BaekJoon/C#] 4344. 평균은 넘겠지  (0) 2021.10.02
[BaekJoon/C#] 2504. 괄호의 값  (0) 2021.09.25

 

문제 

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

 

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

 

출력 

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

 

예제1

입력:

3 1

출력

1
2
3

 

예제2

입력:

4 2

출력

1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3

 

예제3

입력:

4 4

출력

1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1

 

 

코드

using System; 
using System.Text;
using System.Collections.Generic;

class Program
{ 
    static StringBuilder sb = new StringBuilder();
    static int[] input = new int[2];
    static List<int> sequence = new List<int>();
    static List<bool> isUsed = new List<bool>();
    
    static void Main(string[] args) 
    { 
        
        string[] str = Console.ReadLine().Split();
        input[0] = int.Parse(str[0]);
        input[1] = int.Parse(str[1]);

        for(int i=0; i<=input[0]; i++)
        {
            isUsed.Add(false);
        }
        for(int i=0; i<input[1]; i++)
        {
            sequence.Add(-1);
        }
        getNext(0);
        Console.WriteLine(sb.ToString());
    }
    static void getNext(int k)
    {
        if(k==input[1])
        {
            for(int i=0; i<k; i++)
            {
                sb.Append(sequence[i].ToString()+' ');
            }
            sb.Append("\n");
            return;
        }
        for(int i=1; i<=input[0]; i++)
        {
            if(!isUsed[i])
            {
                sequence[k] = i;
                isUsed[i] = true;
                getNext(k+1);
                isUsed[i] = false;
            }
        }
    } 
}



'Coding > BaekJoon' 카테고리의 다른 글

[BaekJoon/JavaScript] 1026. 보물  (0) 2021.10.05
[BaekJoon/JavaScript] 11047. 동전 0  (0) 2021.10.05
[BaekJoon/C#] 4344. 평균은 넘겠지  (0) 2021.10.02
[BaekJoon/C#] 2504. 괄호의 값  (0) 2021.09.25
[BaekJoon/C#] 1920. 수 찾기  (0) 2021.09.25

+ Recent posts