반응형
알고리즘 BOJ_17413_단어뒤집기2_S3
문제 내용
문자열 S이 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' ``'), 특수 문자('<', '>')로만 이루어져 있다
'<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장
<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분무
문제 접근
문자열 S 에서 단어를 뽑아낸다. 뽑아내는 기준은 우선위로<>로 구분을 하고<>안공백(' ')은 바뀌지 않고<>외부의공백(' ')은 바뀌게 된다.일단 List형태로 저장한다. 그리고 <> 태그안에 들어가는 건지 아니면 그냥 문자열인지 구분하는 List 형태로 배열을 하나더 <> 로 된건 true 로 처리 마지막에 List을 출력하면 될듯?
실제 풀이 방법
- 문자열 S 를 받아와서 각 문자를 S.charAt(i) 형식으로 받아 각각의 문자를 비교
- < 일 경우 이전까지 있던 stack 구조에 있는 내용을 전부 출력(역순으로 출력됨) 그리고 그대로 출력
- <> 범위 안이 아닐경우에는 stack 에 추가하는 구조로 구성
- 마지막에 혹시 모를 스택 pop
사용된 알고리즘 or 자료구조
Stack 사용 : static Stack<Character> stack;
import java.io.*;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static String S;
static boolean isCheck;
static Stack<Character> stack;
public static void main(String[] args) throws IOException {
S = br.readLine();
isCheck = false;
stack = new Stack<>();
for (int i = 0; i < S.length(); i++) {
char c = S.charAt(i);
if(!isCheck){
// <> 여부확인
if(c == '<'){
isCheck = true;
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
sb.append(c);
}else if(c == ' '){
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
sb.append(c);
}else{
stack.add(c);
}
}else if(c == '>'){
isCheck = false;
sb.append(c);
}else{
// ischeck 가 true 인경우 <> 안인 경우 그대로 문자열을 넣는다.
sb.append(c);
}
}
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
System.out.println(sb);
}
}
반응형
'알고리즘 문제풀이' 카테고리의 다른 글
| [BOJ][P5] 6549 히스토그램에서 가장 큰 직사각형 (0) | 2025.10.01 |
|---|---|
| [BOJ][G5] 2504 괄호의값 (0) | 2025.09.27 |
| [SWEA][D2] 1940. 가랏! RC카 Java (1) | 2025.06.04 |
| [SWEA][D2] 1945. 간단한 소인수분해 Java (0) | 2025.06.04 |
| [SWEA][D2] 1288. 새로운 불면증 치료 Java (0) | 2025.06.04 |