본문 바로가기
PS/백준

[백준 *Java] - 스택(9012) / 단어뒤집기(9093) / 괄호(10828)

by Jman 2022. 3. 16.

스택

백준 10828

[접근방식]

Stack API 를 사용하기보단, 직접 구현을 해서 문제를 풀었습니다.

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

// 스택 10828문제

public class Boj_10828 {
    private int max;
    private int ptr;
    private int [] stk;

    public Boj_10828(int capacity) {
        ptr = 0;
        max = capacity;
        stk = new int[max];
    }

    public void push (int input) {
        stk[ptr++] = input;
    }

    public int pop() {
        if(ptr <= 0) return -1;
        return stk[--ptr];
    }

    public int top() {
        if (ptr <= 0)
            return -1;
        return stk[ptr-1];
    }

    public int size() {
        return ptr;
    }

    // 안 비어있으면, 0  비어있으면 1
    public int empty() {
        if (ptr <= 0) return 1;
        else return 0;
    }


    public static void main(String [] arg) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int capacity = Integer.parseInt(br.readLine());
        Boj_10828 sk = new Boj_10828(capacity);
        while(capacity > 0) {

            int input;
            st = new StringTokenizer(br.readLine(), " ");

            switch (st.nextToken()) {
                case "push":
                    input = Integer.parseInt(st.nextToken());
                    sk.push(input);
                    break;

                case "pop":
                    System.out.println(sk.pop());
                    break;

                case "size":
                    System.out.println(sk.size());

                    break;

                case "empty":
                    System.out.println(sk.empty());
                    break;

                case "top":
                    System.out.println(sk.top());
                    break;
            }
            capacity--;
        }
    }
}

 

단어뒤집기

백준 9093

[접근방식]

입력한 값 데이터를 받아서 sentence => words => word로 분할하여
word 를 뒤에서부터 글자 하나씩 뽑아서 저장하였습니다.

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

// 단어뒤집기 9093번
public class Boj_9093 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int cnt = Integer.parseInt(br.readLine());
        String [] sentence = new String[cnt];
        for(int i = 0; i < cnt; i++) {
            sentence[i] = br.readLine();
        }

        for (int i = 0; i < cnt; i++) {
            String word = "";
            String [] words = sentence[i].split(" ");
            for (int j = 0; j < words.length; j++) {
                for (int k = words[j].length(); k > 0 ; k--) {
                    word += words[j].charAt(k-1);
                }
                word += " ";
            }
            System.out.println(word);
        }
    }
}

 

괄호

백준 9012

[접근방식]

첫 번째 접근(실패)

1. 처음은 '(' , 끝은 ')' 로 끝나야합니다.

2. ')'와 '('는 숫자가 동일해야합니다.

3. 괄호는 무조건 짝수여야합니다. ( 이 방식으로 했을 시, 2번에서 이슈가 발생합니다)

두 분째 접근(성공)

1. 앞선 첫 번째 방식의 2번을 해결하기 위해서 변수를 하나 줄이고, if문 하나를 더 추가했습니다. (if else 로 카운트+-를 해줍니다)

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

// 괄호 9012 문제
public class Boj_9012 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int cnt = Integer.parseInt(br.readLine()); // 몇 개를 입력할지 수를 나타냅니다.
        String [] array = new String[cnt]; // 괄호를 몇개 받을지 미리 공간할당해줍니다.

        for (int i = 0; i < cnt; i++) {
            array[i] = br.readLine(); // 1. 괄호를 담아줍니다.
        }

        for (int i = 0; i < cnt; i++) { // 2. 괄호 한 줄씩 비교로직을 시작합니다. (하나의 괄호 문자열의 길이는 2 이상 50 이하이다)
            int chk = 0;
            String [] word = array[i].split(""); // 3. 한 줄의 괄호를 하나씩 뽑습니다.
            
            // 이 로직은 (시작일땐 +, )닫아야할땐 - 즉, 한쌍이 되게끔하는 로직입니다.
            for (int k = 0; k < word.length; k++) {
                if(chk >= 0) {
                    if ("(".equals(word[k])) {
                        chk++;
                    } else if (")".equals(word[k])) {
                        chk--;
                    }
                }
            }
            
            // 쌍이 잘 맞을 경우는 chk 된 데이터가 0이어야하고,
            if (chk == 0) {
                System.out.println("YES");
            
            // 쌍이 잘 맞지 않을 경우, chk 된 데이터가 0이 아닐겁니다.
            }else {
                System.out.println("NO");
            }
        }
    }
}​