Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

JAN's History

12주차_백준 문제풀이 본문

백준

12주차_백준 문제풀이

JANNNNNN 2023. 7. 22. 11:31

목차

  • 2504
  • 4358
  • 1406 

문제 2504

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String  N = br.readLine();
        Stack<Character> stack = new Stack<>();
        int result = 0;
        int value = 1;

        for(int i = 0; i < N.length(); i++) {
            if(N.charAt(i) == '(') { 
                stack.push(N.charAt(i)); 
                value *= 2; //( : 2
            } else if(N.charAt(i) == '[') {
                stack.push(N.charAt(i)); 
                value *= 3; //[ : 3
            } else if(N.charAt(i) == ')') {
                if(stack.isEmpty() || stack.peek() != '(') { 
                    result = 0;
                    break;
                } else if(N.charAt(i-1) == '(') {
                    result += value;
                }
                stack.pop();
                value /= 2;
            } else if(N.charAt(i) == ']') {
                if (stack.isEmpty() || stack.peek() != '[') {
                    result = 0;
                    break;
                } else if (N.charAt(i - 1) == '[') {
                    result += value;
                }
                stack.pop();
                value /= 3;
            }
        }
        if(!stack.isEmpty()) sb.append(0).append("\n");
        else sb.append(result).append("\n");
        System.out.println(sb);
    }
}

코드 설명

1.(', '['를 만나면 stack에 해당 괄호를 넣고 value 값에 각각의 2, 3의 값을 곱해준다.

2. ')'을 만나면?

  1. 1.스택이 비어있거나, 스택에 '('이 없으면 ?  result 값을 0으로 변경 후 반복문 탈출!
  2. 2. 바로 이전의 값이 '('이면 ?  value 값을 result에 더해준다.
  3. 3.stack에서 한개 빼기

3. ']'을 만나면?

  1. 1. 2번과 동일!

4. 만약 스택이 비어있다면 ? 0출력 그렇지 않으면 결과값 출력


문제 4358

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;

// 생태학
// 문자열 문제(해시맵 ?)
public class p4358 {
	static HashMap<String, Integer> trees;
	static int allCount;
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		trees = new HashMap<String, Integer>();
		String str = br.readLine();
		while(true) {
            trees.put(str, trees.getOrDefault(str, 0) + 1);
			allCount++;
			
			str = br.readLine();
			if(str == null || str.length() == 0) {
				break;
			}
		}
		
		// 키 오름차순 정렬 
		Object[] keys = trees.keySet().toArray();
		Arrays.sort(keys);
		
		StringBuilder sb = new StringBuilder();
		for(Object key : keys) {
			String keyStr = (String) key;
			int count = trees.get(keyStr);
			double per = (double)(count * 100.0) / allCount;
			
			sb.append(keyStr + " " + String.format("%.4f", per) + "\n");	// 소수점 4번 째 자리까지 출력 
		}
		
		System.out.println(sb.toString());
	}

추가 설명

 

백분율을 구하기 위해 각 종의 전체 개수를 별도로 파악해서 저장해놓아야 합니다.

 

자바에서는 간단하게 소수점 N번 째 짜리까지 출력할 수 있는데요.

 

바로,

 

double per = (double)(count * 100.0) / allCount;

String.format("%.4f", per);

 

입니다.

 

int형으로 연산하면은 소수점까지 계산되지 않고 정수로만 출력되기 때문에

무조건 double 사용해야 합니다!


문제 2504

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        Stack<Character> leftStack = new Stack<>();
        Stack<Character> rightStack = new Stack<>();

        for(int i = 0; i < str.length(); i++){
            leftStack.push(str.charAt(i));
        }

        int N  = Integer.parseInt(br.readLine());

        for(int i = 0; i < N; i++){
            String cmd = br.readLine();
            switch (cmd.charAt(0)){
                case 'L':
                    if(leftStack.empty()) break;
                    rightStack.push(leftStack.pop());
                    break;
                case 'D':
                    if(rightStack.empty()) break;
                    leftStack.push(rightStack.pop());
                    break;
                case 'B':
                    if(leftStack.empty()) break;
                    leftStack.pop();
                    break;
                case 'P':
                    leftStack.push(cmd.charAt(2));
                    break;
            }
        }
        while(!leftStack.empty()){
            rightStack.push(leftStack.pop());
        }
        StringBuilder sb = new StringBuilder();
        while (!rightStack.empty()){
            sb.append(rightStack.pop());
        }
        System.out.println(sb.toString());
    }
}

추가 설명

L : 커서를 왼쪽으로 한 칸 옮김 --> 왼쪽 스택에서 pop한 값을 오른쪽 스택에 push함

D : 커서를 오른쪽으로 한 칸 옮김 --> 오른쪽 스택에서 pop한 값을 왼쪽 스택에 push함

B : 커서 왼쪽에 있는 문자를 삭제함 --> 왼쪽 스택 pop

P $ : $라는 문자를 커서 왼쪽에 추가함 --> 왼쪽 스택 push

'백준' 카테고리의 다른 글

14주차_백준 문제풀이  (0) 2023.08.11
10주차_백준 문제풀이  (0) 2023.07.09
9주차_백준 문제풀이  (0) 2023.06.24
8주차_백준 문제풀이  (0) 2023.06.18
7주차_백준 문제풀이  (0) 2023.05.28