Hope Everyone Is Happy

[실버2] 23304. 아카라카 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버2] 23304. 아카라카 (Java)

J 크 2023. 8. 16. 11:08
728x90
반응형

https://www.acmicpc.net/problem/23304

 

23304번: 아카라카

주어진 문자열 $S$가 아카라카 팰린드롬이라면, AKARAKA를 출력한다. 만약 그렇지 않다면, IPSELENTI를 출력한다.

www.acmicpc.net

연고 or 고연 모두 행복하세요,,,


※  문제를 요약하면 아래와 같습니다.

 회문의 특성을 가지는 한 단어의 접두사 및 접미사 또한 팰린드롬일경우 , 아카라카 팰린드롬

   ex) AKARAKA -> 회문이면서 "AKA" 접두사 및 접미사가 동일한 단어.

즉, 문자의 길이가 S 이면 문자열의 S/2 길이까지 출력 했을 때도 회문.

S/2 길이의 문자열 또한 아카라카 팰린드롬

 입력은 임의 문자열 S

아카라카 팰린드롬일 경우 "AKARAKA" 출력, 아닐 경우 "IPSELENTI" 출력


◈ Input - 1

akaraka

◈ Output - 1

AKARAKA

◈ Input - 2

akbrbka

◈ Output - 2

IPSELENTI

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

임의의 문자열을 입력 받아 회문(Palindrome)인지 판단(true or false)하는 함수 생성

함수 내 에서 회문이 맞을 경우, 문자열의 0(번 ~ 입력 받은 문자 / 2 -1)까지의 문자열을 입력 받아 함수 재호출

    (재귀 함수 특성 및 Substring 함수 활용)

문자열의 길이가 1이 되기 전까지 반복, 반복되는 과정에서 회문 아닐 경우 false

 문자열의 길이가 1이 되면 return true

회문 탐색은 문자열의 길이가 짝수일 경우와 홀수일 경우를 나누어 탐색


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

	public static boolean Palindrome(String strTemp) {

		// 재귀의 끝
		if (strTemp.length() == 1)
			return true;
		if (strTemp.length() <= 0)
			return false;

		int nLeftPoint = 0;
		int nRightPoint = 0;
		if (strTemp.length() % 2 == 0) {
			// ex) ABBA
			nLeftPoint = (strTemp.length() / 2) - 1;
			nRightPoint = (strTemp.length() / 2);
		} else if (strTemp.length() % 2 == 1) {
			// ex) ABCBA
			nLeftPoint = (strTemp.length() / 2) - 1;
			nRightPoint = (strTemp.length() / 2) + 1;
		}
		
		// 회문 탐색
		while (nLeftPoint >= 0 && nRightPoint < strTemp.length()) {
			if (strTemp.charAt(nLeftPoint) != strTemp.charAt(nRightPoint)) {
				return false;
			}
			nLeftPoint--;
			nRightPoint++;
		}
		
		return Palindrome(strTemp.substring(0, (strTemp.length() / 2)));
	}

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));

		String strAkaraka = bReader.readLine();
		
		if(Palindrome(strAkaraka))
			bWriter.write("AKARAKA");
		else
			bWriter.write("IPSELENTI");
		
		bWriter.flush();
		bWriter.close();

	}

}

 문자열과 재귀를 최근에 공부해서 비교적 쉽게 풀었던 것 같습니다. 

읽어주셔서 감사합니다!

Good Luck! (피드백 감사합니다!)