알고리즘/SWExpert알고리즘

[SWEA] 1234번 - 비밀번호 문제

Fenderblue 2023. 4. 22. 02:26

https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

스택으로 풀면 좋을것같아서 스택으로 풀어보았다

연속되는 값들을 소거하면 되니까 스택에서 peek한 값과 입력값의 한 문자씩을 비교하며

같으면 pop하고 Push는 생략, 다르다면 그냥 Push하도록 한다

그러면 스택에 남은 값들이 비밀번호가 될 텐데

스택에서 하나씩 출력하면 역순이 되므로 StringBuilder를 이용해 reverse함수를 이용해 다시 순서대로 해준다

 

풀이코드

package D3;

import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;

public class SW_1234 {  //SWEA 비밀번호 문제
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Character> stack = new Stack<Character>();    //char라고 적으면 안된다..잊지말기
        StringBuilder sb;
        int length;     //번호 총길이
        String code;    //정제되기 전의 번호
        for (int i = 1; i <= 10; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            length = Integer.parseInt(st.nextToken());
            code = st.nextToken();
            String str;
            sb = new StringBuilder();

            for (int j = 0; j < length; j++) {
                if (j == 0) {   //첫번째는 우선 push만한다 peek하면에러나니까
                    stack.push(code.charAt(j));
                    continue;
                }
                if (!stack.isEmpty() && stack.peek() == code.charAt(j)) {   //stack의 top값과 현재값이 같으면 pop해 없애고 push안한다
                    stack.pop();
                } else {    //다르면 push하고 넘어감
                    stack.push(code.charAt(j));
                }
            }
            while(!stack.isEmpty()) {
                sb.append(stack.pop());
            }
            str = sb.reverse().toString();  //String으로 바꿔줘야함! 역순으로 바꾼다 스택이라 거꾸로되니까..
            bw.write("#" + i + " " + str);
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }
}