
내가 생각했을때 문제에서 원하는부분
첫째 줄에 단어의 길이 N(2 ≤ N ≤ 100000)이 주어진다.
둘째 줄과 셋째 줄에는 길이가 N이고 알파벳 소문자로 이루어진 문자열이 주어진다.
두 문자열이 조건을 만족한다면 YES, 만족하지 않는다면 NO를 출력한다.
내가 이 문제를 보고 생각해본 부분
removeVowels 메서드:
이 메서드는 private static String removeVowels(String s) 형태로 정의되어 있다.
static 메서드라 main 메서드에서 객체 생성 없이 바로 호출할 수 있고, private이라 이 클래스 내에서만 사용 가능하다.
전달받은 문자열 s에서 모음(a, e, i, o, u)을 모두 제거하고 자음만으로 이루어진 새로운 문자열을 반환한다.
StringBuilder를 사용하여 문자를 하나씩 추가하는데, StringBuilder는 String 객체를 계속 새로 만들지 않아 문자열 조작 시 성능 면에서 효율적이다.
for(char c : s.toCharArray()) 루프를 통해 문자열 s의 각 문자를 확인하며, 모음이 아닐 경우 StringBuilder에 추가한다.
마지막에 sb.toString()으로 최종 문자열을 반환한다.
입력 처리:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); : 표준 입력을 읽기 위한 BufferedReader 객체를 생성한다.
int N = Integer.parseInt(br.readLine()); : 첫 줄에서 단어의 길이 N을 읽어 정수로 변환한다.
String word1 = br.readLine(); : 두 번째 줄에서 첫 번째 단어를 읽는다.
String word2 = br.readLine(); : 세 번째 줄에서 두 번째 단어를 읽는다.
조건 변수 초기화:
boolean condition1 = false;
boolean condition2 = false;
boolean condition3 = false;
세 개의 boolean 변수를 선언하고 false로 초기화하여 각 조건의 만족 여부를 알려준다.
조건 1: 재배열 가능성 (아나그램) 확인:
char[] arr1 = word1.toCharArray();
char[] arr2 = word2.toCharArray();
두 단어를 각각 char 배열로 변환한다.
Arrays.sort(arr1);
Arrays.sort(arr2);
두 배열을 오름차순으로 정렬한다.
아나그램이라면, 정렬된 문자열은 서로 같아야 한다.
if(Arrays.equals(arr1, arr2)) { condition1 = true; } : 정렬된 두 배열이 완전히 동일한지 Arrays.equals()로 비교하고, 같으면 condition1을 true로 설정한다.
조건 2: 첫 글자 및 마지막 글자 동일 확인:
if(word1.charAt(0) == word2.charAt(0) && word1.charAt(N - 1) == word2.charAt(N - 1)) : charAt(0)으로 첫 글자를, charAt(N-1)으로 마지막 글자를 가져와 비교한다.
&& 연산자로 두 조건 모두 true일 경우 condition2를 true로 설정한다.
조건 3: 모음 제거 후 동일 확인:
String consonants1 = removeVowels(word1);
String consonants2 = removeVowels(word2);
removeVowels 헬퍼 메서드를 호출하여 각 단어에서 모음을 제거한 자음 문자열을 얻는다.
if(consonants1.equals(consonants2)) { condition3 = true; } : 두 자음 문자열이 equals() 메서드를 통해 같은지 비교하고, 같으면 condition3을 true로 설정한다.
최종 결과 출력:
if(condition1 && condition2 && condition3) : 세 가지 조건 변수가 모두 true일 경우, 즉 모든 조건을 만족하면 System.out.println("YES");를 출력한다.
else { System.out.println("NO"); } : 그렇지 않으면 System.out.println("NO");를 출력한다.
br.close();: BufferedReader는 시스템 자원을 사용하므로, 사용 후에는 반드시 닫아주어 자원 누수를 방지한다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
// 백준 25178번 문제
public class Main1223 {
// 모음을 제거하는 헬퍼 메서드
private static String removeVowels(String s) {
StringBuilder sb = new StringBuilder();
for(char c : s.toCharArray()) {
if(c != 'a' && c != 'e' && c != 'i' && c != 'o' && c != 'u') {
sb.append(c);
}
}
return sb.toString();
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 단어의 길이 N
String word1 = br.readLine(); // 첫 번째 단어
String word2 = br.readLine(); // 두 번째 단어
boolean condition1 = false; // 1. 재배열 가능성 (아나그램)
boolean condition2 = false; // 2. 첫 글자 및 마지막 글자 동일
boolean condition3 = false; // 3. 모음 제거 후 동일
// 조건 1: 재배열 가능성 (아나그램) 확인
char[] arr1 = word1.toCharArray();
char[] arr2 = word2.toCharArray();
Arrays.sort(arr1);
Arrays.sort(arr2);
if(Arrays.equals(arr1, arr2)) {
condition1 = true;
}
// 조건 2: 첫 글자 및 마지막 글자 동일 확인
if(word1.charAt(0) == word2.charAt(0) && word1.charAt(N - 1) == word2.charAt(N - 1)) {
condition2 = true;
}
// 조건 3: 모음 제거 후 동일 확인
String consonants1 = removeVowels(word1);
String consonants2 = removeVowels(word2);
if(consonants1.equals(consonants2)) {
condition3 = true;
}
// 모든 조건이 참이면 YES, 아니면 NO 출력
if(condition1 && condition2 && condition3) {
System.out.println("YES");
} else {
System.out.println("NO");
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.