ffinn92 / Keep-at-solve-it

꾸준히 알고리즘 풀기 위한 스터디 저장소입니다.
2 stars 3 forks source link

[220717][Tany][인프런](5-5) 쇠막대기 #98

Closed juni8453 closed 2 years ago

juni8453 commented 2 years ago

📌 문제

⭐️ 아이디어

🤔 고민한 내용

💪 새롭게 배운 내용

🆘 이해가 어려운 내용

❌ 해결하지 못한 이유

✅ 본인 풀이

🏋️‍♀️ 시도횟수 : 2회 | ⏱ 걸린시간 : 123ms | 💾 메모리 : 26MB

  1. 최초 풀이 방식 (오답)
    
    import java.io.IOException;
    import java.io.BufferedReader;
    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 input = br.readLine();

    int answer = solution(input);
    System.out.println(answer);
}

private static int solution(String input) {
    int count = 0;
    Stack<Character> stack = new Stack<>();

    for (char x : input.toCharArray()) {
        // 열린 괄호일 때,
        if (x == '(') {
            stack.push(x);

        // 닫힌 괄호일 때, peek() 이 열린 괄호인지 아닌지 판단.
        } else {
            if (stack.peek() == '(') {
                // 닫힌 괄호 바로 앞이 열린 괄호이므로 레이저.
                // Stack 에 들어있는 열린 괄호 갯수만큼 쇠 막대기가 존재하기 때문에 레이저를 만나면 해당 열린 괄호 갯수만큼 더해야 한다.
                // 더하기 전에 레이저의 열린 괄호는 Stack 에서 지워주자.
                stack.pop();
                count += stack.size();

            } else {
                // 닫힌 괄호 바로 앞이 열린 괄호가 아니므로 레이저가 이닌 쇠 막대기.
                stack.pop();
                count ++;
            }
        }
    }

    return count;
}

}


2. 두번째 풀이 방식 (정답)
~~~java
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;

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

        int answer = solution(input);
        System.out.println(answer);
    }

    private static int solution(String input) {
        int count = 0;
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) == '(') {
                stack.push(input.charAt(i));
            } else {
                // 레이저라면 ?
                if (input.charAt(i - 1) == '(') {
                    stack.pop();
                    count += stack.size();
                // 쇠 막대기라면 ?
                } else {
                    stack.pop();
                    count ++;
                }
            }
        }

        return count;
    }
}

참고한 자료