250x250
250x250
JinSeopKim
Hello World!
JinSeopKim
전체 방문자
오늘
어제
  • 분류 전체보기 (168)
    • Artificial intelligence (14)
      • DeepDiveToAI (3)
      • Pytorch (3)
      • Etc (8)
    • Back-end (19)
      • Spring (10)
      • JPA (9)
    • Language (24)
      • Python (3)
      • Java (11)
      • Swift (10)
    • Math (4)
      • Linear Algebra (4)
    • CodingTest (79)
      • Algolithm (12)
      • Backjoon (25)
      • Programmers (42)
    • Etc (27)
      • Book Review (3)
      • Adsp (6)
      • Life (2)
      • Docker (1)
      • odds and ends (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • GitHub

인기 글

태그

  • 브루트포스
  • AI
  • BOJ
  • JPA
  • SpringMVC
  • BFS
  • Front-end
  • 카카오
  • swift
  • 개발
  • certificate
  • 알고리즘
  • ADsP
  • 개발자
  • ios
  • 문제풀이
  • 프로그래머스
  • 머신러닝
  • java
  • DP
  • JAVA8
  • 파이썬
  • Python
  • uArm
  • 선형대수
  • 백준
  • 구현
  • 코딩테스트
  • data
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JinSeopKim

Hello World!

BOJ_14888 연산자 끼워넣기 (Java)
CodingTest/Backjoon

BOJ_14888 연산자 끼워넣기 (Java)

2022. 1. 6. 00:15
728x90
728x90

문제링크

https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

문제풀이

👨🏻‍💻 핵심 스킬 👨🏻‍💻
 브루트포스

연산자를 끼워 넣는 문제는 브루트포스로 해결하였다. 연산자의 개수는 숫자 배열의 크기 -1 이므로 최대 10개이다. 10개를 순서를 고려하여 나열하는 방법은 최대 10!이므로 시간초과 없이 해결할 수 있다. 따라서, 만들수 있는 모든 연산자의 경우의수를 만들어준 뒤 계산해 주면 쉽게 해결할 수 있다. 

 

구현코드

package boj_14888;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for(int i =0 ;i< a.length; i++){
            a[i] = sc.nextInt();
        }
        int plusNum = sc.nextInt();
        int minusNum = sc.nextInt();
        int mulNum = sc.nextInt();
        int divNum = sc.nextInt();

        int[] cal = new int[n-1];
        ArrayList<int[]> cals = new ArrayList<>();
        orderCal(cals,cal,plusNum,minusNum,mulNum,divNum,0);

        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        int result = 0;
        for(int i = 0; i < cals.size(); i++){
            int x = a[0];
            int y;
            int[] c = cals.get(i);
            for(int j = 1; j < a.length; j++){
                int oper = c[j-1];
                y = a[j];
                if(oper == 1)
                    result = x+y;
                else if(oper == 2)
                    result = x-y;
                else if(oper == 3)
                    result = x*y;
                else{
                    result = x/y;
                }
                x = result;
            }
            if(max < result){
                max = result;
            }
            if(min > result){
                min =result;
            }
            result = 0;
        }
        System.out.println(max);
        System.out.println(min);
    }

    public static void orderCal(ArrayList<int[]> cals, int[] cal, int plusNum, int minusNum, int mulNum, int divNum, int idx){

        if(idx == cal.length){
            int[] result = new int[cal.length];
            for(int i = 0; i < cal.length; i++){
                result[i] = cal[i];
            }
            cals.add(result);
            return;
        }

        if(plusNum != 0){
            cal[idx] = 1;
            orderCal(cals,cal,plusNum-1,minusNum,mulNum,divNum,idx+1);
        }
        if(minusNum != 0){
            cal[idx] = 2;
            orderCal(cals,cal,plusNum,minusNum-1,mulNum,divNum,idx+1);
        }
        if(mulNum != 0){
            cal[idx] = 3;
            orderCal(cals,cal,plusNum,minusNum,mulNum-1,divNum,idx+1);
        }
        if(divNum != 0){
            cal[idx] = 4;
            orderCal(cals,cal,plusNum,minusNum,mulNum,divNum-1,idx+1);
        }
    }
}

 

시간복잡도

시간복잡도는 배열의 크기인 n-1을 나열하는 값이므로 $O(n!)$이다.

잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)

 

728x90
728x90
저작자표시 비영리

'CodingTest > Backjoon' 카테고리의 다른 글

[BOJ_4574] 스도미노쿠 (java)  (0) 2022.01.12
[BOJ_16197] 두 동전 (java)  (0) 2022.01.11
[BOJ_16931] 겉넓이 구하기 (java)  (0) 2021.12.31
[BOJ_2290] LCD Test (java)  (0) 2021.12.31
[BOJ_15685] 드래곤 커브 (Java)  (0) 2021.12.29
    'CodingTest/Backjoon' 카테고리의 다른 글
    • [BOJ_4574] 스도미노쿠 (java)
    • [BOJ_16197] 두 동전 (java)
    • [BOJ_16931] 겉넓이 구하기 (java)
    • [BOJ_2290] LCD Test (java)
    JinSeopKim
    JinSeopKim
    기록📚

    티스토리툴바