놀이공원 인형 맞추기

놀이공원에 가면 인형 맞추기 게임이 있다.

한 놀이공원에는 인형에 숫자를 써놓고 인형 맞추기를 한다.

그런데 맞춘 인형의 숫자의 합이 특정한 값이 되는 경우에만 맞춘 인형을 가져 갈 수 있다.

가령 10개의 인형에 쓰여진 숫자가 각각 25 27 3 12 6 15 9 30 21 19이고 숫자의 합이 50이 되는 경우만 인형을 가져갈수 있다면 6 19 25가 쓰여진 인형을 맞춰야 인형을 가져 갈 수 있다.

이때 인형의 갯수와 각각의 숫자와 필요한 합을 입력받으면 맞춰야 하는 인형의 숫자를 출력하는 프로그램을 작성해 보자.

입력 - 첫줄에는 인형의 갯수와 필요한 합, 둘째줄에는 인형 각각에 쓰여진 숫자

예)

10 50

25 27 3 12 6 15 9 30 21 19

출력 - 필요한 합이 되는 인형 각각의 숫자를 오름차순으로 출력

예)

6 19 25

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

5개의 풀이가 있습니다.

java로 작성해봤습니다 지적 환영합니다

import java.util.*;
import java.io.*;

public class doll {

    public static void main(String[] args) throws FileNotFoundException {
        Scanner sc = new Scanner(new File("c:/oop/doll.txt"));
        int n = sc.nextInt();
        int mubiao = sc.nextInt();
        ArrayList<Integer> nums = new ArrayList<Integer>();
        boolean[] result = new boolean[n];
        Random ran = new Random();
        while (sc.hasNext()){
            nums.add(sc.nextInt());
        }
        Collections.sort(nums);
        int sum=0;
        while(sum!=mubiao){
            sum=0;
            for(int i=0; i<n;i++){
                result[i]=ran.nextBoolean();
                if (result[i]==true) sum+=nums.get(i);
            }
        }
        for(int i=0; i<n;i++){
            if (result[i]==true) System.out.print(nums.get(i)+" ");


        }

    }

}

입력 값(doll.txt) 10 50

25 27 3 12 6 15 9 30 21 19

실행결과 6 19 25

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Java

  • 이진수를 이용해 모든 경우의 합을 계산하고 일치할 때 출력.
  • break 문을 넣으면 처음 일치하는 경우만 출력.
import java.util.Scanner;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.regex.Pattern;

public class TargetDolls {
    public static void process(String input1, String input2) {
        String[] inputList1 = Pattern.compile(" ").split(input1);
        int size = Integer.parseInt(inputList1[0]);
        int targetSum = Integer.parseInt(inputList1[1]);
        int[] sortedList = Pattern.compile(" ").splitAsStream(input2)
                .mapToInt(Integer::parseInt).sorted().toArray();
        int binaryMax = (int)Math.pow(2d, (double)size);
        for (int i = 1; i < binaryMax; i++) {
            if (computeSum.apply(i, sortedList) == targetSum) {
                showResult.accept(i, sortedList);
                //break;
            }
        }
    }

    private static BiFunction<Integer, int[], Integer> computeSum = (caseNum, values) -> {
        int pos = 0, sum = 0;
        while (caseNum > 0) {
            sum += caseNum % 2 == 1 ? values[pos]:0;
            pos++;
            caseNum = caseNum/2;
        }
        return sum;
    };

    private static BiConsumer<Integer, int[]> showResult = (caseNum, values) -> {
        int pos = 0;
        while (caseNum > 0) {
            System.out.print(caseNum % 2 == 1 ? values[pos]+" ":"");
            pos++;
            caseNum = caseNum/2;
        }
        System.out.println();
    };

    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            String input1 = sc.nextLine();
            String input2 = sc.nextLine();
            TargetDolls.process(input1, input2);
        }
    }
}

결과

  • 입력: 5 10
  • 입력: 1 2 3 4 5
  • 1 2 3 4
  • 2 3 5
  • 1 4 5
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.util.Random;* 

public class DollHitter {

    public static void main(String args[]){

    int num = 15;
    int sum = 60;
    Random ran = new Random();

    int arr[] = new int[num];
    for(int i = 0 ; i < num ; i++){

        arr[i] = ran.nextInt(30)+1;
        for(int j = 0 ; j < i ; j++){
            if(arr[i] == arr[j]){
                i--;
            }
        }
    }
    중복되지 않는 30 이하 난수 15개 생성 (제한 포인트는 맘대로 지정하셔도 됩니다)

    for(int i = 0 ; i < arr.length ; i++){
        System.out.print(arr[i]+" : ");
    }

    int set[] = {};

    for(int i = 0 ; i < arr.length ; i++){
        set = new int[3];
        set[0] = arr[i];
        for(int j = i+1 ; j < arr.length ; j++){
            set[1] = arr[j];
            for(int k = j+1 ; k < arr.length ; k++){
                set[2] = arr[k];
                if(set[0]+set[1]+set[2] == sum){
                    System.out.println(set[0]+" : "+set[1]+" : "+set[2]);
                }

            }
        }

    }

    바깥 for문은 생성된 난수 배열의 합이 60이 되는 세개의 숫자중 첫번재 숫자
    중간 for문은 생성된 난수 배열의 합이 60이 되는 세개의 숫자중 두번재 숫자
    안쪽 for문은 생성된 난수 배열의 합이 60이 되는 세개의 숫자중 세번째 숫자




    }

}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class AmusementPark {

    public static void main(String[] args) throws FileNotFoundException {
        String path = AmusementPark.class.getResource("").getPath();
        Scanner sc = new Scanner(new File(path + "AmusementPark.txt"));

        int size = sc.nextInt();
        int target = sc.nextInt();
        int[] dolls = new int[size];

        for (int i = 0; i < size; i++) {
            dolls[i] = sc.nextInt();
        }

        for (int i = 1; i < 1 << size; i++) {
            int k = i;
            int d = 0;
            List<Integer> t = new ArrayList<>();
            while (k > 0) {
                if (k % 2 == 1) t.add(dolls[d]);
                k = k / 2;
                d++;
            }
            if (t.stream().mapToInt(Integer::intValue).sum() == target) {
                System.out.println(t);
            }
        }
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

package codingdojang;

import java.util.Scanner;

public class doll {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner s=new Scanner(System.in);

    int dollCnt=s.nextInt();
    int dollSum=s.nextInt();
    int arr[]=new int[dollCnt];
    for(int i=0;i<dollCnt;i++){
        arr[i]=s.nextInt();
    }
    int n1=0,n2=0,n3=0;
    for(int i=0;i<10;i++){
        for(int j=i+1;j<10;j++){
            for(int k=j+1;k<10;k++){
                if(arr[i]+arr[j]+arr[k]==50){
                    n1=i;
                    n2=j;
                    n3=k;
                    break;
                }
            }
        }
    }
    System.out.println(arr[n1]+" , "+arr[n2]+" , "+arr[n3]);
}

}


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 17
java x 5
python x 7
ruby x 1
기 타 x 2
cs x 1
matlab x 1