투케이2K

230. (java/자바) 알고리즘 : 짝지어 제거하기 - stack 스택 , while true 무한루프 , for 반복문 , stringbuffer 본문

Java

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 문에서 리턴 결과를 변경합니다

* */


 

반응형
Comments