[간단 문제 설명]
입력된 문자열에서, 소괄호 내에 있는 문자를 제거하고 남은 문자만 출력하도록 한다.
솔루션 코드는 아래와 같다. ↴
public String solution(String s){
Stack<Character> stack=new Stack<>();
char tmp=' ';
for(char x: s.toCharArray()){
stack.push(x);//')'가 나올때까지 push한다.
if(x==')'){
do{
tmp=stack.pop();
if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
}while(tmp!='('); //'('가 나올때까지 pop.
}
}
char[] carray=new char[stack.size()]; //stack 내(內) 문자를 저장할 배열
for(int i=0; i<stack.size(); i++){ //배열에 stack 안에 있는 문자를 맨 처음 입력된 문자부터 순서대로 저장
carray[i]=stack.get(i);
}
return String.valueOf(carray); //문자 배열을 문자로 변환하여 반환.
}
기본적인 아이디어:
- ')'가 나올 때까지 문자를 stack에 .push()한다.
- 만약 ')' 가 나오면, '('가 나올 때 까지 .pop()한다.
- 문자열 전체를 대상으로 1,2번을 반복한다.
- 남은 문자를 문자열로 변환하여 반환한다.
*** ')'를 만난 후 .pop()메서드를 실행할 때 꼭!!! '('를 남겨두지 않고 모두 제거해줘야한다!
이번 문제는 생각보다 쉽게 해결해서 뿌듯했다.
하지만 문제 풀이 후 강의를 보니, 내 코드에 대해 아쉬운 점들이 많이 보였다.
코드를 다시 한 번 다듬어보자.
① 6~11번 줄
if(x==')'){
do{
tmp=stack.pop();
if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
}while(tmp!='('); //'('가 나올때까지 pop.
}
↪ 굳이 문자를 저장하는 변수 tmp를 선언하여 stack.pop()의 값을 저장하여 이용했다.
while()문에서 조건식만 잘 활용해도 불필요한 변수를 선언하지 않을 수 있다.
if(x==')'){
while(stack.pop()!='('){ //'('가 나올때까지 pop.
if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
}
}
필자는 위에서 문자열 첫 문자가 ')'일 경우까지 고려했지만,
만약 문자열의 첫 문자가 절대로 ')'부터 시작하지 않는다면 더 깔끔하게 정리할 수 있다.
if(x==')') while(stack.pop()!='('); //'('가 나올때까지 pop.
***while문에서 반복할 내용을 꼭 넣지않아도 된다는 것, 조건식만도 활용 가능하다는 것을 처음 깨달았다.
② 13~19번 줄
char[] carray=new char[stack.size()];
for(int i=0; i<stack.size(); i++){
carray[i]=stack.get(i);
}
return String.valueOf(carray);
↪ stack 내(內) 문자를 저장하기 위해 배열을 선언하고, 배열을 String으로 변환하는 방법을 사용하였다.
배열이 아니라 String 변수를 선언하고 활용할 수도 있다. ↴
String answer=' ';
for(int i=0; i<stack.size(); i++){
answer+=stack.get(i);
}
return answer;
수정한 솔루션 코드
public String solution(String s){
Stack<Character> stack=new Stack<>();
char tmp=' ';
for(char x: s.toCharArray()){
stack.push(x); //')'가 나올때까지 push한다.
if(x==')'){
while(stack.pop()!='('){ //'('가 나올때까지 pop.
if(stack.isEmpty()) break; //문자열 첫 문자가 ')'일 경우.
}
}
String answer=' ';
for(int i=0; i<stack.size(); i++){
answer+=stack.get(i);
}
return answer;
}
'프로그래밍 > JAVA 프로그래밍' 카테고리의 다른 글
[백준]1744번 '수 묶기'(JAVA, 그리디) (0) | 2024.09.03 |
---|---|
[코딩연습_JAVA] 크레인 인형뽑기 (0) | 2024.03.01 |
[코딩연습_JAVA] 올바른 괄호 (0) | 2024.02.17 |
[코딩연습_JAVA] K번째 큰 수 (0) | 2024.02.14 |
[코딩연습_JAVA] 학급 회장(Hash) (24.02.12) (0) | 2024.02.13 |