모든 함수는 Oracle 11g를 기준으로 작성되었다.

간략하게 사용해본 함수를 정리한 것이고, 자세한 사용법이나 정확한 정보는 Oracle에서 제공하는 레퍼런스를 참고하는게 좋다. 정리도 잘되어있고, 각 기능마다 예시로 함께 나와있다. 아래는 레퍼런스로 바로 이동.

Functions

 

Functions

 

docs.oracle.com

 

Sigle Row Function

 

NUMERIC FUNCTION    

    ABS(N)                      절대값

    CEIL(N)                      반올림 CEIL(X.XX)    소수점에서 올림

    FLOOR(N1)                 소수점 이하 버림

    ROUND(N1, Integer)     반올림. 정수범위,소수점 범위 모두 가능

    TRUNC(N1,N2)            N1을 N2자리에서 버림(잘라낸다.) N2자리를 비워두면 소수점자리를 잘라내 정수화 한다. 

    MOD(N1,N2)              MOV(SAL,500)    N1을 N2로 나눈 나머지

    POWER(N1,N2)           POWER(2,3)    N1의 N2제곱    2^3=8;

 

 

CHARSET FUNCTION

    CONCAT(CH1,CH2)       CH1과 CH2를 이어붙인다.

                                    연달아 연결도 가능하다.  SELECT CONCAT( CONCAT( ENAME, 'IS A ' ), JOB )

    INITCAP(STR)              문자열 각 단어의 첫글자를 대문자로 뒤글자는 소문자로 자동 변경

    UPPER(STR)                문자열 전부 대문자로

    LOWER(STR)               문자열 전부 소문자로

    LENGTH(STR)              주어진 문자열의 길이를 숫자로 반환, 띄어쓰기도 포함된다.

    SUBSTR(STR,N1,N2)      문자열의 N1자리부터 N2길이만큼 잘라서 반환.

                                   N1이 음수라면 뒤에자리부터 세어서 위치를 정함.

    INSTR(STR, search_ch, [N1], [N2])    문자열에서 search_ch가 있는지 N1자리부터 시작해서

                                               N2번째로 찾아지는 search_ch위치를 숫자로 반환한다.

                                              N1과 N2를 기입하지 않으면, 그냥 처음부터 search_ch를 찾다가 첫번째 search_ch  위치를 반환.

    TRIM(trim_STR FROM STR)        문자열 양 끝단의 trim_STR을 제거, 따로 입력하지 않으면 공백만 제거되고 주어진 trim_STR가 반복되면 반복 전부가 제거된다. (단일 ch가 아닌 문자열을 지정할 수 도 있다.)

    LTRIM(trim_ch, STR)        문자열의 왼쪽만 TRIM

    RTRIM(trim_ch, STR)        문자열의 오른쪽만 TRIM

    LPAD(STR, N1, EXPR)       문자열의 좌측을 지정한 EXPR로 채워서 전체 길이가 N1이 되게 맞춤.            

    RPAD(STR, N1, EXPR)       문자열의 우측을 지정한 EXPR로 채워서 전체 길이가 N1이 되게 맞춤.

 

 

DATETIME FUNCTION

    SYSDATE                             현재 ORACLE SYSTEM상의 시간 리턴

    ADD_MONTHS(DATE, N1)        DATE 값에 N1만큼 달수를 더한 DATE 리턴, 음수도 가능

    CURRENT_DATE                    현재 DATETIME 반환

    LAST_DAY(DATE)                   DATE상의 해당 월 마지막 날의 DATE 리턴

    NEXT_DAY(DATE, '요일')          DATE를 기준으로 다음번 요일에 해당하는 DATE 리턴

    ROUND(DATE, 'FMT')             DATE에서 FMT('YEAR' or 'MONTH' ...) 기준으로 반올림 한 DATE를 리턴

       ex) SELECT TO_CHAR(ROUND(SYSDATE, 'YEAR') , 'YY-MM-DD')  ->  올해 첫날 기준 DATE 리턴해 STR으로 출력

    TRUNC(DATE, 'FMT')

    

    

CONVERSION TYPE

    형변환에선 포맷 지정이 중요하다.

    DATE - CHAR 간의 포맷 'YEAR', 'MONTH', 'DD', 'YYYY-MM-DD', 'HH' 'AM' 'PM' 등

    NUMBER - CART 간의 포맷 '999,999', '000000' 등

 

    TO_CHAR(DATETIME, FORMAT)

     ex) SELECT TO_CHAR( SYSDATE, 'YYYY-MM-DD' )

            'YYYY-MM-DD, HH:MI:SS'    //2019-11-17, 10:11:12

            'YEAR', 'MONTH', 'DD'    //2019년, 11월, 17일

            'DAY'            //월요일

            'DDD', 'D'            //312일(1년기준 현재일 표시), 1(일주일 기준 일요일1일)

            

 

    TO_CHAR(NUMBER, FORMAT)        //포맷을 안넣으면 그냥 숫자만 'NUMBER'모양으로 만든다.

     ex)  SELECT TO_CHAR(SAL, '999,999')    //숫자와 함께 포멧을 뒤에 ' '안에 표시해줘야한다.

                        //포멧을 9로 표현시 자리만 확보, 0으로 표시할경우 빈자리를 0으로 채운다.

    TO_DATE(STR, FORMAT)        

      ex) SELECT TO_DATE(

                'January 15, 1989, 11:00 A.M.',        

                'Month dd, YYYY, HH:MI A.M.',        

                 'NLS_DATE_LANGUAGE = American')    

                 FROM DUAL;

 

    TO_NUMBER(STR,FORMAT)

            SELECT TO_NUMBER( '1000' , '9999' )        //1000숫자 반환.

                      ( '1,000' , '9,999' )'

    

    DECODE        대상이 되는 COLUMN 값에 따라 결과값을 대조시킴.

        (COLUMN_NAME,  1, RESULT1    ( ) 안에 모든 경우를 다 넣어줌.  컬럼의 값이 1일때 RESULT1

                2, RESULT2    값이 2일때 RESULT2

                RESULT3 )    나머지의 경우 RESULT3을 대입시킴.

        SELECT product_id,

                   DECODE (warehouse_id, 1, 'Southlake',

                                      2, 'San Francisco',

                          3, 'New Jersey',

                                               4, 'Seattle',

                                          'Non domestic') "Location"

 

    CASE         대상이 되는 COLUMN값에 따라 결과값을 대조시킴, 대상의 값을 조사할때 범위도 넣어줄수 있다.

        CASE column_name WHEN search1 THEN result1    CASE쿼리는 ( )나 , 없이 나열한다.

                 WHEN search1 THEN result1        WHEN뒤에 조건, THEN뒤에 대입 값을 적는다.

                ELSE result3 END            ELSE뒤에 값을 넣어서 DEFUALT대입값을 넣을 수 있다.(생략도 가능)

                                END로 끝을 알림.

 

'ORACLE > ORACLE 기초' 카테고리의 다른 글

7. DML-Insert, Delete, Update  (0) 2020.09.12
6. DML - Select구문  (0) 2020.09.12
4. 연산자 Operator  (0) 2020.09.12
3. SQL의 기본 구성 구문  (0) 2020.09.12
2. Oracle Data Type  (0) 2020.09.12

 산술 연산자

    +, -, *, /                        //DATE는 - 만 가능, 이경우 차이나는 일수가 나온다.

    MOD(N1,N2)                 //FUNCTION이지만, 나머지를 구할경우

 

비교 연산자

    <, >, =, <=, >=             

    <>, !=

    

    IS NILL    

    IS NOT NULL

 

논리 연산자

    AND                             SAL<= 2000 AND SAL>=1000    

    BETWEEN A AND B          SAL BETWEEN 1000 AND 2000    //이상, 이하로 포함이다.

    

    OR                               SAL=2000 OR SAL=3000

    IN( A, B, C )                    SAL IN(1000, 2000, 3000)

    

    LIKE                              ENAME LIKE '_E%'        //LIKE뒤 해당 위치에 해당 문자가 있는지 검색

    

    ESCAPLE                        WHERE ENAME LIKE '_A#_A%' ESCAPLE '#'

                                       #(다른 기호도가능)뒤에 나오는 문자( _ )를 SQL상 OPERATOR가 아닌 문자 그대로 인식.

 

'ORACLE > ORACLE 기초' 카테고리의 다른 글

6. DML - Select구문  (0) 2020.09.12
5. 함수 Function  (0) 2020.09.12
3. SQL의 기본 구성 구문  (0) 2020.09.12
2. Oracle Data Type  (0) 2020.09.12
1. 오라클(Oracle) 명령어 체계 미완  (0) 2019.12.09

SQL(STRUCTURED QUERY LANGUAGE)

    SELECT        보여줄내용

    FROM        추출할 대상 테이블

    WHERE        추출 대상 조건

    GROUP BY    그룹지어줄 대상이 되는 COLUMN을 뒤에 지정해준다.

    HAVING        그룹의 조건절, 조건에 만족하는 그룹만 select

    ORDER BY    정렬 기준이 되는 COLUMN을  뒤에 지정해준다.

 

    AS NAME or "NAME"    보려는 데이터에 별칭을 선언해줄수 있다.

 

    ||             CONCATENATION, 여러 칼럼을 이어주는 명령어.

 

    DISTINCT            칼럼명 앞에 붙여서 칼럼 내 중복된 값들을 제거하고 하나만 보여준다.

 

* WHERE 구문이 GROUP BY 보다 먼저 실행된다. WHERE구문으로 각 행을 모두 선택 후 그룹핑이 된다.

* GROUP BY의 경우 집계함수와 함께 사용해야 한다.

* AS 로 별칭을 지어줄 경우 각 구문의 실행 순서에 따라 별칭으로의 대상 접근이 제한된다. 실행순서가 낮은 구문에서 지어준 별칭을 실행순서가 높은 구문에서 접근하려 하면 대상을 인지하지 못한다.

'ORACLE > ORACLE 기초' 카테고리의 다른 글

5. 함수 Function  (0) 2020.09.12
4. 연산자 Operator  (0) 2020.09.12
2. Oracle Data Type  (0) 2020.09.12
1. 오라클(Oracle) 명령어 체계 미완  (0) 2019.12.09
0.오라클 DB란? 미완  (0) 2019.12.09

    NUMBER(N1,N2)        N1은 전체자리수(소수점포함), N2는 소수점 자리수.

                                  NUMBER 하나로 정수, 실수를 모두 표현할 수 있다.

                                 만약 12345.67 과 같이 소수점 이상이 5자리이고, 소수점 이하가 2자리라면 NUMBER(7,2)

 

    DATE('YY/MM/DD')     기본형. ( ) 안에 포맷을 지정해서 다른 형태로 저장도 가능하다. 지정되어 있는 형태와 쿼리를 날려 접근할 때 형태를 일치시켜야 한다.

 

    CHAR            문자저장 기본타입. 2000바이트로 크기가 고정된다.

    VARCHAR2     가변적인 길이의 문자열 저장되는 데이터에 따라 크기가 변한다. 최대 4000바이트 까지 저장이 가능하다.

        가능한 VARCHAR2를 사용하는 것이 자원을 절약할 수 있다. 용량이 큰 데이터의 경우 아래 대용량 타입을 선택하도록 한다.

 

    CLOB      Cha의 대용량 데이터 타입. 최대 4g까지 저장이 가능하다.

    BLOB      Binary의 대용량 데이터 타입. 최대 4g까지 저장이 가능하다.

 

'ORACLE > ORACLE 기초' 카테고리의 다른 글

5. 함수 Function  (0) 2020.09.12
4. 연산자 Operator  (0) 2020.09.12
3. SQL의 기본 구성 구문  (0) 2020.09.12
1. 오라클(Oracle) 명령어 체계 미완  (0) 2019.12.09
0.오라클 DB란? 미완  (0) 2019.12.09

문제 설명

출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위 중 몇 개를 제거하려고 합니다.
예를 들어, 도착지점이 25만큼 떨어져 있고, 바위가 [2, 14, 11, 21, 17] 지점에 놓여있을 때 바위 2개를 제거하면 출발지점, 도착지점, 바위 간의 거리가 아래와 같습니다.

제거한 바위의 위치각 바위 사이의 거리거리의 최솟값

[21, 17] [2, 9, 3, 11] 2
[2, 21] [11, 3, 3, 8] 3
[2, 11] [14, 3, 4, 4] 3
[11, 21] [2, 12, 3, 8] 2
[2, 14] [11, 6, 4, 4] 4

위에서 구한 거리의 최솟값 중에 가장 큰 값은 4입니다.

출발지점부터 도착지점까지의 거리 distance, 바위들이 있는 위치를 담은 배열 rocks, 제거할 바위의 수 n이 매개변수로 주어질 때, 바위를 n개 제거한 뒤 각 지점 사이의 거리의 최솟값 중에 가장 큰 값을 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 도착지점까지의 거리 distance는 1 이상 1,000,000,000 이하입니다.
  • 바위는 1개 이상 50,000개 이하가 있습니다.
  • n 은 1 이상 바위의 개수 이하입니다.

 

나의 풀이

 이번 문제는 이분탐색으로 해결하기 위해 상당히 애를 먹은 문제.. 이해하는데도 시간이 좀 걸렸고 다른 사람의 풀이들을 찾아보며 이해하고 재작성해본 것인데도 뭔가 내꺼가 된 느낌이 아직 안든다...

 풀이는 코드를 작성하면서 생각이 정리되는데로 주석으로 넣었다

 이분탐색 개념이 아니라 이분탐색으로 문제에 적용하고 풀어가는 방법에 대해 특공이 필요하다 느꼈다

 

코드

import java.util.*;

class Solution {
    public int solution(int distance, int[] rocks, int n) {
        int answer = 0;
        Arrays.sort(rocks);
        int pl = 0;
        int pr = distance;
        int pc, removeCount, lastRock;
        
        // 임의의 거리를 pc라고 놓고, 바위들간 거리의 최솟값으로 pc가 되기 위해 돌을 제거한다.
        // 만약 pc가 최솟값이 유지 안되는 돌이 있다면 해당 돌을 제거해버릴 것이다.
        // 몇 개의 돌을 제거하면 될지 이진검색으로 검색한다.
        // n개만큼의 돌을 제거해서 pc가 최솟값이 된다면 그 pc를 answer에 저장한다.
        // 얻은 pc 값중에 제일 큰값을 asnwer에 저장하도록 반복하며 Math.max로 answer값을 갱신한다.
        
        while(pl<=pr) {
            // 처음 제거한 돌의 수는 0에서 시작,
            removeCount = 0;
            // 처음 돌의 위치는 0부터 시작(출발점)
            lastRock = 0;
            // 최솟값을 pc라고 임의로 설정한다.
            pc = (pl+pr)/2;
            
            //pc가 최솟값이 되도록 for문으로 모든 돌들의 위치를 확인해 돌을 제거하거나 그대로 둔다.
            for(int i=0; i<rocks.length; i++) {
                // 만약 마지막에 있던 돌(혹은 시작점) - 현재돌 만큼의 거리가
                // pc보다 작으면 pc가 돌사이 거리 중 최솟값이 될 수 없기때문에
                // rocks[i] 현재 돌을 제거한다고 본다.
                if(rocks[i]-lastRock < pc) removeCount++;
                
                // 마지막에 있던 돌 - 현재돌 만큼의 거리가 pc보다 멀다면
                // 현재 돌을 제거하지 않아도 pc가 돌사이 거리 중 최솟값으로 유지된다.
                // 그리고 다음 돌과의 현재돌 사이에 거리를 측정하기 위해 현재돌을 마지막 돌에 대입한다.
                else lastRock = rocks[i];
            }
            
            //종착점 - 마지막에 있던 돌 사이의 거리가 pc보다 작다면
            //마지막 돌을 제거해야만 pc가 최솟값으로 유지 될 수 있다.
            if(distance - lastRock < pc) removeCount++;
            
            if(removeCount <=n) {
                // pc가 최솟값이 되기 우해서 제거한 돌의 수가 지정된 n보다 작다면
                // pc를 이전에 구했던 answer과 비교해서 큰 값을 저장한다.
                answer = Math.max(answer, pc);
                // 조건을 만족하는 다른 pc값이 없는지 다시 재조사 한다.
                pl = pc+1;
            } else {
                //지정한 n보다 더 많은 수의 돌을 제거해야만 pc가 최솟값이 된다면,
                //이 조건은 성립하지 않기 때문에 pc값을 갱신한다.
                pr = pc - 1;
            }
            
        }
        
        return answer;
    }
}

문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

 

나의 풀이

 풀이 접근은 최종값은 항상 1이기 때문에 1부터 시작해서 주어진 수 num 까지 올라가는 bottom-up 방식으로 풀이를 시작했다. (그냥 풀었는데 정리하면서 찾아보니 bottom-up이라는 용어가 있었음...)

 DP니깐 이전 연산은 저장해놔야한다 라는 개념이 있다보니 어떻게 값을 저장할지가 고민이었다. 그러다 찾은 방법이 배열을 만들고 arr[n]에는  1 을  세 가지 연산 +1, *2 , *3 을 조합해 n을 만들때까지 필요한 최소한의 연산 횟수를 저장해 나가는 방법이었다.

 

 쉽게 예시로 보자면

    arr[2] 는 1를 2로 만들기 위해 +1, *2, *3  세 가지 연산을 사용하면서 연산 횟수가 가장 적은 값을 저장한다.

    arr[3] 은 1을 3로 만들기 위해 +1, *2, *3 세 가지 연산을 사용하면서 연산 횟수가 가장 적은 값을 저장한다.

 

 이와 같은데 여기서 DP의 개념을 적용할 수 있는 부분이 바로 1을 n/3까지 도달하게 할때 최소연산횟수를 x라 하면

 1-> n 까지 필요한 최소 연산횟수는 x + 1 이라는 점이다. 

 

 쉽게 예시로 보자면

  1 -> 3으로 만들기 위한 연산은 최소 1회 (*3 연산시)

  1 -> 9 로 만들기 위한 연산은 1+1 = 2회 라는 점 (*3 연산시)

 

 이를 +1 연산이나 *2 연산에도 적용해 점화식으로 보자면

   arr[n] = arr[n-1] +1  

   arr[n] = arr[n/2] +1  (n%2==0)

   arr[n] = arr[n/3] +1   (n%3==0)

 

여기 까지만 봐도 이제 배열의 규칙성이 보이기 시작하는데, 만약 n이 2와 3 모두 나누어 떨어지는 수라면 위 세 가지 연산 결과 중 가장 값을 arr[n] 에 대입해주면 되는 것이다. 

 

 

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int num = Integer.parseInt(br.readLine());
        int[] arr = new int[num+1];
        
        for(int i=2; i<=num; i++) {
            arr[i] = arr[i-1]+1;
            if(i%2==0)
                arr[i] = Math.min(arr[i], arr[i/2]+1);
            if(i%3==0)
                arr[i] = Math.min(arr[i], arr[i/3]+1);
        }
        
        bw.write(arr[num]+"\n");
        bw.flush();
    }
}

문제 설명

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
  • 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
  • 심사관은 1명 이상 100,000명 이하입니다.

 

나의 풀이

 이분탐색(BinerySearch)으로 최소값을 구하는 문제로 기본적인 이분탐색 문제라 생각하고 코드를 작성했는데 테스트 통과가 일부만 됐다. 어디가 문제인지 한참을 찾았는데 일부 변수를 버릇처럼 int타입으로 해놓은게 문제였다... 이분탐색도 정리해서 올려놔야할듯

 

코드

import java.util.*;

class Solution {
    public long solution(int n, int[] times) {
        Arrays.sort(times);
        
        return binerySearch(times, n, times[times.length-1]);
    }
    
    public static long binerySearch(int[] times, int n, long max) {
        long pl = 1, pr = max *n;
        long pc = 0;
        long result = Long.MAX_VALUE;
        
        while(pl <= pr) {
            pc = (pl + pr)/2;
            
            long temp = 0;
            for(int i=0; i<times.length; i++) {
                temp += pc/times[i];
            }
            
            if(temp>=n) {
                result = result>pc ? pc : result;
                pr = pc-1;
            } else {
                pl = pc+1;
            }
        }
        return result;
    }
}

문제

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

나의 풀이

  모든 집은 이웃하는 집과 다른 색상이어야 한다. 때문에 각 행에서 요소들이 선택할 수 있는 경우의 수는 이전 행에서 자기와 다른 열의 요소 2가지로 고정된다. 그 2가지 중에서 작은 값을 선택하면서 값을 누적시키고, 젤 마지막 행에서 

최소 값을 선택하도록 하였다.

 

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int num = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[][] arr = new int[num][3];
        arr[0][0] = Integer.parseInt(st.nextToken());
        arr[0][1] = Integer.parseInt(st.nextToken());
        arr[0][2] = Integer.parseInt(st.nextToken());
        
        int r,g,b;
        for(int i=1; i<num; i++) {
            st = new StringTokenizer(br.readLine());
            r = Integer.parseInt(st.nextToken());
            g = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            
            arr[i][0] = r + Math.min(arr[i-1][1], arr[i-1][2]);
            arr[i][1] = g + Math.min(arr[i-1][0], arr[i-1][2]);
            arr[i][2] = b + Math.min(arr[i-1][0], arr[i-1][1]);
        }
        
        int min = Math.min(arr[num-1][0], Math.min(arr[num-1][1], arr[num-1][2]));
        
        bw.write(min+"\n");
        bw.flush();
    }
}

+ Recent posts