투케이2K
230. (java/자바) 알고리즘 : 짝지어 제거하기 - stack 스택 , while true 무한루프 , for 반복문 , stringbuffer 본문
230. (java/자바) 알고리즘 : 짝지어 제거하기 - stack 스택 , while true 무한루프 , for 반복문 , stringbuffer
투케이2K 2021. 8. 9. 09:22[개발 환경 설정]
개발 툴 : Eclipse
개발 언어 : Java
[소스 코드]
package ex6;
import java.util.Stack;
public class MainActivity10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("[Program Start]");
System.out.println("");
/**
* [짝지어 제거하기]
* 1. 짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다
* 2. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다
* 3. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
* 4. 입출력 예시 :
* - s = baabaa / result = 1
* - s = cdcd / result = 0
* 5. 프로그래머스 사이트 : https://programmers.co.kr/learn/courses/30/lessons/12973
* */
// 초기 변수 선언 실시
String data = "baabaa"; // [1 번]
//String data = "cdcd"; // [2 번]
// 결과 출력 메소드 호출
System.out.println("결과 : " + solution(data));
}// 메인 종료
public static int solution(String s) {
// 초기 결과를 반환할 변수 선언 실시
int result = 0;
// 인풋으로 들어온 데이터 확인 실시
System.out.println("input : " + s);
System.out.println("");
// 로직 처리 실시 [방법 1]
/**
* [세부 설명]
* 1. stack 구조를 사용해 데이터가 저장되어있지 않은 경우 먼저 push 삽입합니다
* 2. stack 구조에서 데이터가 들어있는 경우 peek 맨 위에 저장된 요소 데이터 확인
* >> for문에서 현재 확인중인 문자와 같은 경우
* >> pop을 사용해서 문자 제거를 실시합니다
* 3. 최종적으로 스택에서 모든 데이터가 정상적으로 제거된 경우 리턴 값을 반환합니다
* */
// 스택 객체 선언 실시 (LIFO - 라스트인 펄스트아웃)
Stack<Character> stack = new Stack<Character>();
// for 반복문을 인풋으로 들어온 문자열 길이 만큼 반복 수행
for(int i=0; i<s.length(); i++){
// 스택에 들어있는 데이터와 현재 for문에서 비교하고자하는 문자가 같은 경우 (짝 문자 판단)
if(!stack.isEmpty() && stack.peek() == s.charAt(i)) {
stack.pop(); // pop 데이터 삭제 실시
}
else {
stack.push(s.charAt(i)); // push 데이터 삽입 실시
}
}
// 스택에서 정상적으로 모든 값이 제거된 경우
if(stack.isEmpty()) result = 1;
// 로직 처리 실시 [방법 2]
/**
* [세부 설명]
* 1. while true 무한루프와 for 반복문을 사용해서 같은 문자열이 있는지 확인합니다
* 2. StringBuffer 를 사용해서 문자열 제거를 실시합니다
* 3. sb.delete(시작, 종료 전까지) 문자열을 삭제한다는 의미입니다
* 4. 성공적으로 짝문자열 제거 성공 시 for 문에서 flag 값을 변경해 while 문에서 리턴 결과를 변경합니다
* */
/*
StringBuffer sb = new StringBuffer(s); // stringbuffer에 인풋으로 들어온 문자열 삽입 실시
while(true) { // 무한루프 선언 실시
// for 반복문 선언 실시 및 문자열 제거 실시
boolean check = false;
for (int i=0; i<sb.toString().length(); i++) {
if((i+1)<sb.toString().length()) { // 저장된 문자열 길이보다 작을 동안 체크
if(sb.charAt(i) == sb.charAt(i+1)) { // 현재 번지 문자와 다음 번지 문자가 같은 경우 (짝 문자 판단)
sb.delete(i, i+2); // 문자열 제거 실시 (시작, 종료 전까지)
System.out.println("remove : " + sb.toString());
System.out.println("");
check = true; // 삭제 성공 수행 플래그 값 지정
break; // for 반복문 탈출
}
}
}
if (check == true){
result = 1; // 리턴 결과 값에 1 저장 실시
}
else {
break; // check 삭제를 수행한 값이 없을 경우 while true 무한루프 탈출 실시
}
}
*/
// 결과 반환 실시
return result;
}
}// 클래스 종료
[결과 출력]
[요약 설명]
/**
* [짝지어 제거하기]
* 1. 짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다
* 2. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다
* 3. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
* 4. 입출력 예시 :
* - s = baabaa / result = 1
* - s = cdcd / result = 0
* 5. 프로그래머스 사이트 : https://programmers.co.kr/learn/courses/30/lessons/12973
* */
// 로직 처리 실시 [방법 1]
/**
* [세부 설명]
* 1. stack 구조를 사용해 데이터가 저장되어있지 않은 경우 먼저 push 삽입합니다
* 2. stack 구조에서 데이터가 들어있는 경우 peek 맨 위에 저장된 요소 데이터 확인
* >> for문에서 현재 확인중인 문자와 같은 경우
* >> pop을 사용해서 문자 제거를 실시합니다
* 3. 최종적으로 스택에서 모든 데이터가 정상적으로 제거된 경우 리턴 값을 반환합니다
* */
// 로직 처리 실시 [방법 2]
/**
* [세부 설명]
* 1. while true 무한루프와 for 반복문을 사용해서 같은 문자열이 있는지 확인합니다
* 2. StringBuffer 를 사용해서 문자열 제거를 실시합니다
* 3. sb.delete(시작, 종료 전까지) 문자열을 삭제한다는 의미입니다
* 4. 성공적으로 짝문자열 제거 성공 시 for 문에서 flag 값을 변경해 while 문에서 리턴 결과를 변경합니다
* */