/** * Created by sanghyoun on 2017. 3. 14.. */ publicclassCh1_6{ publicstatic BigInteger[] dp = new BigInteger[1000];
publicstaticvoidmain(String[] args){ Scanner input = new Scanner(System.in); // 0 이 입력 될 때까지 입력 무한 반복. while (true) { System.out.print("Tpye number (max num = 1000) : "); int max = Integer.parseInt(input.nextLine()); if (max == 0) { System.out.println("End of Factorial."); break; } // 결과값 출력 System.out.println(factorialDP(max)); } }
// 일반적인 Recursive factorial 계산 publicstatic BigInteger factorial(int num){ if (num == 1) { returnnew BigInteger("1"); } else { return factorial(num - 1).multiply(new BigInteger(Integer.toString(num))); } }
// Dynamic Programing 방식 factorial 계산 publicstatic BigInteger factorialDP(int num){ if (num == 1) { Ch1_6.dp[num] = new BigInteger("1"); } elseif (Ch1_6.dp[num] == null) { Ch1_6.dp[num] = Ch1_6.factorialDP(num - 1).multiply(new BigInteger(Integer.toString(num))); } return Ch1_6.dp[num]; } }
13번 문제
문제의 해석이 이상하게 된 것인지 제대로 이해가 가지 않았다. 일단 내가 이해 한 바는 아래와 같다.
1~49로 채워진 배열 리스트에서 임의의 인덱스에 있는 숫자를 뺀다. 6번 반복 후, 없어진 수를 찾아 출력한다.
/** * Created by sanghyoun on 2017. 3. 15.. */ publicclassCh1_14{ publicstaticvoidmain(String[] args){ Scanner scan = new Scanner(System.in); ArrayList<ArrayList<Integer>> dim2num = new ArrayList<>(); while (scan.hasNextLine()) { String line = scan.nextLine(); if ("".equals(line)) { break; } String[] nums = line.split(" "); ArrayList<Integer> temp = new ArrayList<>(); for (String num : nums) { temp.add(Integer.parseInt(num)); } dim2num.add(temp); } if (magicSquare(dim2num)) { System.out.println("YES"); } else { System.out.println("NO"); } }
publicstaticbooleanmagicSquare(ArrayList<ArrayList<Integer>> arr){ int sum=0; // 동남쪽 대각선 합 구하기 for (int i=0; i < arr.size(); i++) { sum += arr.get(i).get(i); }
// 동북쪽 대각선 검사 int temp=0; for (int i=arr.size() - 1; i >= 0; i--) { temp += arr.get(i).get(i); } if (sum != temp) { returnfalse; } // 가로 검사 for (ArrayList<Integer> yPos : arr) { temp = 0; for (int i=0; i<yPos.size(); i++) { temp += yPos.get(i); } if (sum != temp) { returnfalse; } } // 세로 검사 for (int i=0; i < arr.size(); i++) { temp = 0; for (ArrayList<Integer> xPos : arr) { temp += xPos.get(i); } if (sum != temp) { returnfalse; } } returntrue; } }
15번 문제
파스칼 삼각형 이다. 문제에서는 2차원 ArrayList 에 작성 n의 파스칼 삼각형을 작성하라고 나와있어서 따로 입력을 받고 해당 숫자만큼 반복하게 만들었다. 확인을 위한 출력 코드까지 포함하고 있다.
/** * Created by sanghyoun on 2017. 3. 20.. */ publicclassCh1_15{ publicstaticvoidmain(String[] args){ System.out.print("Type number : "); Scanner input = new Scanner(System.in); int num = Integer.parseInt(input.nextLine()); ArrayList<ArrayList<Integer>> tri = new ArrayList<>(); pascal(num, tri); for(ArrayList<Integer> first : tri) { System.out.print("[ "); for(int tmp : first) { System.out.print(tmp + " "); } System.out.println("]"); } }
publicstaticvoidpascal(int num, ArrayList<ArrayList<Integer>> tri){ for (int i = 0; i < num; i++) { ArrayList<Integer> temp = new ArrayList<>(); // 가장 앞에 있는 1을 추가함 temp.add(1); // 각 n번째의 숫자를 위의 배열에서 읽어온 다음 더해서 저장. for (int k = 1; k < i; k++) { int sum = tri.get(i-1).get(k - 1) + tri.get(i-1).get(k); temp.add(sum); } // 가장 뒤에 있는 1을 추가함 if (i != 0) { temp.add(1); } tri.add(temp); } } }