코딩테스트 문제/프로그래머스

[프로그래머스] 회문확인

유호야 2022. 12. 18. 08:20
반응형

문제
문자열 str과 정수 n이 주어진다.
문자열 str의 어떤 문자를 n번 이하로 제거하였을 경우, 회문이 되는지 그 여부(True, False)를 출력하시오.
회문 : 순서대로 읽어도 거꾸로 읽어도 똑같은 문장
abba, tenet, kayak

너무 어려웠다......

어려움을 겪었던 부분 중에 하나는

메서드에서 재귀함수를 이용하는데

for문에서 빠져나가더라도 재귀함수를 멈추지는 못하는 현상이 일어나서 타입을 boolean으로 지정한 다음에 매서드를 반환할 때 true인지 false인지 확인하고

바로 멈추게 하고 싶은데 그것이 안돼서 value에 값이 한 번 true일 때 따로 false로 변경해서 지정하는 부분이 없게 했다. 

import java.util.Scanner;

public class Eliminate {

	public static void main(String[] args) {
		
		Scanner scn = new Scanner(System.in); 
		String str = scn.nextLine();
		String word = str.split(" ")[0]; 
		int no = Integer.parseInt(str.split(" ")[1]);
		
		System.out.println((eliminateOne(word, no, false) == true ? "True" : "False"));
	} 

	static boolean eliminateOne(String word, int num, boolean value) {
		if(value == false) {
		} else {
			return true;
		}
		for (int i = 0; i < word.length(); i	++) {
			String removed = "";
			if (i == 0) {
				removed = word.substring(i + 1);
			} else if (i == word.length() - 1) {
				removed = word.substring(0, i);
			} else {
				removed = word.substring(0, i) + word.substring(i + 1);
			}

			
			if(reverseCheck(removed) == true) {
				value = true;
				return true;
			}  
			
			// for 문속에서 재귀함수 호출하고 나서 다시 먼저 호출한 for문 사용하면 숫자를 다시 되돌려 놔야 하므로...
			int tmp = num;
			tmp--;
			
			if (tmp > 0) {
				value = eliminateOne(removed, tmp, value);
			} 
		}
		return value;
	}

	// 회문인지 확인하는 function - 완료
	static boolean reverseCheck(String input) {
		boolean check = false;

		String[] arr = input.split("");
		String reverseWord = "";
		// 거꾸로 단어 뒤집기
		for (int i = arr.length - 1; i >= 0; i--) {
			reverseWord += arr[i];
		}

		if (input.equals(reverseWord))
			check = true;

		return check;
	}

}
반응형