일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 텐션 업 10기 화이팅
- SSAFY IM/A
- 아자아자 화이팅
- SSAFY 화이팅
- 수학
- DP
- amazon
- 모르고리즘
- have a nice day
- Have a good day :)
- HAVE A GOOD DAY
- BFS
- 네트워크
- DFS
- Java 환경 설정
- Hamming weight
- I am Korean
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- SSAFY 10기 화이팅
- 자료구조
- SSAFY 테스트
- 우유가옆으로넘어지면아야
- 텐션 업 10기!
- 자고 싶다
- 우유가 옆으로 넘어지면 아야
- 코로나 싫어요
- 우유아야
- Have a nice day.
- SeongSeobDang
- Today
- Total
Hope Everyone Is Happy
[실버2] 23304. 아카라카 (Java) 본문
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! (피드백 감사합니다!)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[골드4] 9963. N-Queen (Java) (2) | 2023.08.20 |
---|---|
[실버1] 11729. 하노이 탑 이동 순서 (Java) (0) | 2023.08.17 |
[실버5] 17478. 재귀함수가 뭔가요? (Java) (2) | 2023.08.15 |
[실버3] 3613. Java vs C++ (Java) (0) | 2023.08.13 |
[실버5] 14490. 백대열(Java) (0) | 2023.08.13 |