23년 4월 26일 [알고리즘 - 자료구조]

sua·2023년 4월 25일
0

알고리즘 가보자고

목록 보기
8/101

백준 17413번 단어 뒤집기 2

문제

링크 : https://www.acmicpc.net/problem/17413

나의 풀이

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine() + " ";

        Stack<Character> stack = new Stack<>();
        StringBuilder sb = new StringBuilder();
        boolean flag = false;
        for(char c : s.toCharArray()) {
            if(c == '<') {
                while(!stack.isEmpty()) {
                    sb.append(stack.pop());
                }
                sb.append("<");
                flag = true;
            } else if(c == '>') {
                sb.append(">");
                flag = false;
            } else if(flag) {
                sb.append(c);
            } else if(c == ' '){
                while(!stack.isEmpty()) {
                    sb.append(stack.pop());
                }
                sb.append(' ');
            } else {
                stack.push(c);
            }
        }

        System.out.println(sb);
    }
}

문자열을 뒤집기 위해 스택을 사용하고, 태그에 해당하는 문자인지 아닌지를 구분하기 위해 flag 변수를 사용합니다. 문자열을 for문을 돌려서 태그의 시작인 경우 앞의 문자까지 뒤집어서 출력시켜줘야 하므로 스택에 있는 모든 문자를 pop 시켜서 sb(StringBuilder)에 추가시켜줍니다. 그런 다음 < 문자도 추가시켜준 뒤 태그의 시작이므로 flag 변수를 true로 변경해줍니다.
태그의 끝인 경우는 > 문자를 sb에 추가시켜주고 태그가 끝이 났으므로 flag 변수를 false로 변경해줍니다.
flag가 true인 경우 즉 태그에 해당하는 문자인 경우에는 sb에 추가해서 뒤집어지지 않고 그대로 출력되게 해줍니다.
공백인 경우는 그 앞에 있던 문자들이 한 단어라는 의미이므로 스택에 있는 문자를 sb에 추가시켜주어 한 단어를 뒤집게 해줍니다. 그런 다음 공백도 sb에 추가해줍니다.
그 외에 경우는 뒤집어야할 단어에 해당하기 때문에 문자들을 stack에 push로 넣어줍니다.
마지막에는 sb를 출력시켜주게 구현하였습니다.

결과


백준 10799번 쇠막대기

문제

링크 : https://www.acmicpc.net/problem/10799

나의 풀이

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();

        int count = 0;
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == '(') {
                stack.push(c);
            } else {
                stack.pop(); // 닫는 괄호와 짝인 여는 괄호 한개를 뽑아내야 한다.
                if(s.charAt(i - 1) == '(') { // 레이저인 경우
                    count += stack.size();
                } else { // 막대기인 경우
                    count += 1;
                }
            }
        }

        System.out.println(count);
    }
}

쇠막대기의 개수를 셀 count 변수를 선언 및 초기화해준다. 문자열을 for문을 돌려서 여는 괄호일 경우에는 스택에 넣어서 닫는 괄호가 나올 때 까지 짝을 기다리는 역할을 한다.
닫는 괄호일 경우에는 일단 닫는 괄호와 짝인 스택의 가장 위에 있는 여는 괄호를 pop을 이용해서 뽑아내고 앞의 문자가 여는 괄호였을 경우에는 레이저라는 뜻이므로 스택 사이즈만큼 count에 더해준다. 앞의 문자가 여는 괄호가 아니었을 경우에는 막대기라는 뜻이므로 count에 1을 더해준다. 마지막에는 count 변수 값을 출력해주면 된다.

결과


백준 17298번 오큰수

문제

링크 : https://www.acmicpc.net/problem/17298

나의 풀이

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int arr[] = new int[n];
        int answer[] = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        for(int i = 1; i < n; i++) {
            while(!stack.isEmpty() && arr[stack.peek()] < arr[i]) {
                answer[stack.pop()] = arr[i];
            }
            stack.push(i);
        }
        while(!stack.isEmpty()) {
            answer[stack.pop()] = -1;
        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        for(int i = 0; i < n; i++) {
            bw.write(answer[i] + " ");
        }
        bw.flush();
    }
}

제일 처음 스택에 0번째 인덱스를 뜻하는 0을 넣는다.
1부터 n까지 for문을 돌면서 스택이 비어있지 않고 스택의 가장 위에 있는 요소인 인덱스에 위치한 값이 현재 값 보다 작은 경우는 현재 값이 오큰수라는 뜻이므로 정답 배열의 스택의 pop한 값인 인덱스에 현재 값을 할당해준다. 그 다음은 현재 인덱스 i는 아직 오큰수가 뭔지 모르기 때문에 스택에 push해준다.
for문을 돌고 나서 스택에 남은 것들은 오큰수가 없다는 뜻이므로 while문을 이용해서 정답 배열에 -1로 초기화 해준다. 그런 다음 정답 배열을 출력 해주면 된다.

결과

profile
가보자고

0개의 댓글