반응형
package com.ji.beakjoon;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class IronBar {

	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 cutIronCount = 0;

		String bracketStr = String.valueOf(br.readLine());
		Stack<Integer> stack = new Stack<>();

		for (int i = 0; i < bracketStr.length(); i++) {
			// 열린 괄호 일 경우
			if (bracketStr.substring(i, i + 1).equals("(")) {
				stack.push(i); // '('경우만 저장
			} else { // 닫힌 괄호 일 경우
				
				// stack의 마지막 저장 index가 바로 전 index와 같으면 레이저('()')를 의미
				if (stack.peek() == i - 1) {
					//스택 안에는 쇠파이프 시작점 index가 저장되므로 
					//레이저에 의해서 잘려진 쇠파이프와 동일함
					cutIronCount += stack.size();
				} else {
					// ')'')' 일경우는 단순 증가
					cutIronCount++;
				}
				stack.pop();
			}
		}

		// 스택 사용안하는 풀이
//		for (int i = 0; i < input.length(); i++) {
//            char c = input.charAt(i);
// 
//            if (c == '(') { // 열린 괄호면 open에 1을 더해 줌.
//                open++;
//            } else { // 닫힌 괄호일 경우,
//                open--; // 일단 open에 1을 빼 줌.
// 
//                if (input.charAt(i - 1) == '(') { // 그 전 괄호가 열린 괄호면 레이저를 의미.
//                    ans += open; // open의 값만큼 더해 줌.
//                } else { // 그 전 괄호가 닫힌 괄호면 레이저가 아님.
//                    ans++; // 단순히 1을 더해 줌.
//                }
//            }
//        }

		bw.write(String.valueOf(cutIronCount));

		br.close();
		bw.flush();
		bw.close();
	}

}
728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[백준] 숨바꼭질  (0) 2021.06.13
[백준] ATM  (0) 2021.06.13
[백준] 잃어버린 괄호  (0) 2021.06.13
[백준] 1로 만들기  (0) 2021.06.13
[백준] 바이러스  (0) 2021.06.13
반응형
package com.ji.beakjoon;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class LostBracket {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		String calcuFormula = String.valueOf(br.readLine());
		int result = Integer.MAX_VALUE;

		// 마이너스 기준으로 순자 분리
		for (String formula : calcuFormula.split("-")) {
			int temp = 0;

			// 플러스가 포함된 수식의 경우 계산하여 temp에 저장
			for (String plusFormula : formula.split("\\+"))
				temp += Integer.parseInt(plusFormula);

			// 첫번째 숫자로 초기화
			// Q) Integer.MAX_VALUE 로 초기 값을 해야하는 이유????
			// 초기 값을 0으로 하면 temp값과 일치하므로 재귀적으로 돌게됨
			result = (result == Integer.MAX_VALUE) ? temp : result - temp;
		}

		bw.write(String.valueOf(result));

		br.close();
		bw.flush();
		bw.close();
	}

}
728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[백준] ATM  (0) 2021.06.13
[백준] 쇠막대기  (0) 2021.06.13
[백준] 1로 만들기  (0) 2021.06.13
[백준] 바이러스  (0) 2021.06.13
[프로그래머스] 신규 아이디 추천  (0) 2021.06.13
반응형
package com.ji.beakjoon;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MakeNumberOne {

	static Integer[] dp;
	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 inputNumber = Integer.valueOf(br.readLine());
		
		dp = new Integer[inputNumber + 1];
		dp[0] = dp[1] = 0;
		
		int result = recur(inputNumber);
		
		bw.write(String.valueOf(result));

		br.close();
		bw.flush();
		bw.close();

	}

	public static int recur(int N) {
		 
		if (dp[N] == null) {
			// 6으로 나눠지는 경우 
			if (N % 6 == 0) {
				dp[N] = Math.min(recur(N - 1), Math.min(recur(N / 3), recur(N / 2))) + 1;
			}
			// 3으로만 나눠지는 경우 
			else if (N % 3 == 0) {
				dp[N] = Math.min(recur(N / 3), recur(N - 1)) + 1;
			}
			// 2로만 나눠지는 경우 
			else if (N % 2 == 0) {
				dp[N] = Math.min(recur(N / 2), recur(N - 1)) + 1;
			}
			// 2와 3으로 나누어지지 않는 경우
			else {
				dp[N] = recur(N - 1) + 1;
			}
		}
		
		return dp[N];
	}
	

	static int recur2(int N, int count) {
		// N이 2 미만인 경우 누적된 count값을 반환
		if (N < 2) {
			return count;
		}
		return Math.min(recur2(N / 2, count + 1 + (N % 2)), recur2(N / 3, count + 1 + (N % 3)));
 
	}

}
728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[백준] 쇠막대기  (0) 2021.06.13
[백준] 잃어버린 괄호  (0) 2021.06.13
[백준] 바이러스  (0) 2021.06.13
[프로그래머스] 신규 아이디 추천  (0) 2021.06.13
[프로그래머스] [1차] 캐시  (0) 2021.06.13

+ Recent posts