✔ 비밀번호
문제 분석하기
스택 이용해 앞에 입력한 비밀번호가 새로 들어오는 비밀번호와 같다면 모두 제거
손으로 풀어보기
- 번호 문자열 입력
- 번호 문자열을 한 문자씩하여 스택에 집어넣기
- 스택의 바로 앞에 같은 비밀번호가 존재한다면 함께 제거
- 같은 비밀번호가 존재하지 않는다면 집어넣기
- 스택에 존재하는 비밀번호 출력
슈도코드 작성하기
T(테스트 케이스 수) = 10
for(T만큼) {
N(문자열이 포함하는 문자의 총 수)
s(번호 문자열)
answer = 비밀번호 만들기(s)
#T와 answer 반환
}
비밀번호 만들기 {
stack(비밀번호를 저장할 스택)
for(i -> N만큼) {
if(!stack.isEmpty() && v.peek() == i) {
stack.pop()
}
else {
stack.push()
}
}
StringBuilder sb = new StringBuilder()
while(!stack.isEmpty()) {
sb.insert(0, stack.pop())
}
return sb
}
코드 구현하기
/**
* 1234) 비밀번호
*/
public class D001_1234 {
static int N;
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
// T(테스트 케이스 수) = 10
int T = 10;
// T만큼
for (int test_case = 1; test_case <= T; test_case++) {
// N(문자열이 포함하는 문자의 총 수)
N = sc.nextInt();
// s(번호 문자열)
String s = sc.next();
// answer = 비밀번호 만들기(s)
String answer = makePassword(s);
// #T와 answer 반환
System.out.println("#" + test_case + " " + answer);
}
}
// 비밀번호 만들기
private static String makePassword(String s) {
// stack(비밀번호를 저장할 스택)
Stack<Character> stack = new Stack<>();
for (int i = 0; i < N; i++) {
// 스택이 비어 있지 않으면서 스택의 top이 현재 비밀번호와 같다면
if (!stack.isEmpty() && stack.peek() == s.charAt(i)) {
// 소거
stack.pop();
}
// 스택에 현재 비밀번호 추가
else {
stack.push(s.charAt(i));
}
}
// 스택에 남아 있는 비밀번호 꺼내서 저장
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.insert(0, stack.pop());
}
return sb.toString();
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[42747] H-Index (0) | 2023.11.24 |
---|---|
[1238] Contact (0) | 2023.11.23 |
[1233] 사칙연산 유효성 검사 (0) | 2023.11.22 |
[1232] 사칙연산 (0) | 2023.11.22 |
[1231] 중위순회 (0) | 2023.11.22 |