[SWEA] 1234. 비밀번호

new Dean( );·2021년 7월 30일
0

알고리즘

목록 보기
7/30

문제

1234. [S/W 문제해결 기본] 10일차 - 비밀번호
0~9로 이루어진 번호 문자열을 준다. 이때, 같은 번호 2개가 연속하면 소거한다!! 그리고 남은 숫자들(비밀번호가 됨)을 출력한다.

슈룩 풀려서 재밌는 문제였다. 롯데월드 자이로스윙같이 안빡센데 재밌음.

풀이

Stack 자료구조를 활용한다!
1. 비밀번호를 순서대로 stack에 넣는다.
2. stack.peek() 와 현재 숫자가 일치하면 stack.pop() 해준다. (같은 번호 연속!!)
3. 다 넣었으면 String에 숫자를 차례차례 넣어준다.

result = stack.peek() + result; // 입력 순서를 지켜주기 위함
stack.pop(); // 이거 안해주면 큰일남. 무한루프...ㅠ

처음엔 int로 변환해서 넣어줄까 했는데, 비교(위 2번)할 때마다 변환할 생각하니 아득했다. 그리고 비밀번호를 반환하는 것이 아니고 출력하는 것이므로 타입은 중요하지 않았다. String에 담기도 훨씬 편하다.

자바코드

import java.util.Scanner;
import java.util.Stack;
import java.io.FileInputStream;

class Solution
{
	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);
		int T = 10;
		for(int test_case = 1; test_case <= T; test_case++)
		{
			int size = sc.nextInt();
			String input = sc.next();
			
			System.out.printf("#%d %s\n", test_case, getPassword(input, size));
		}
	}
	
	public static String getPassword(String input, int size) {
		Stack<Character> stack = new Stack<>();
		for (int i=0; i<size; i++) {
			if (stack.isEmpty()) {
				stack.push(input.charAt(i));
				continue;
			}
			if (stack.peek() == input.charAt(i)) {
				stack.pop();
			} else {
				stack.push(input.charAt(i));
			}
		}
		String result = "";
		while(!stack.isEmpty()) {
			result = stack.peek() + result;
			stack.pop();
		}
		return result;
	}
}

주의

stack.pop()을 잊어선 안 돼..

0개의 댓글