문제 : boj25178
필요 알고리즘 개념
- 구현, 문자열
- 문제에 제시된대로 코드를 짤 수 있는 구현력(?)만 있으면 풀 수 있다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
문제에서 제시된 '조건'을 모두 파악할 수 있게 짜주면 된다. 이 때 두 문자열을 각각 a와 b라고 부르겠다. 조건을 하나씩 생각해보자.
1. 한 단어를 재배열해 다른 단어를 만들 수 있어야 한다.
a와 b 내부에 있는 각 소문자의 갯수가 동일하면 된다. a와 b를 character 단위로 정렬 후 인덱스 순서대로 보면서 서로 다른 문자가 존재한다면 조건 1은 만족하지 않는 것이다. 이 경우 O(NlogN)이 필요하다.
카운팅 정렬을 사용하면 O(N)에 가능하다. 코드를 참고해보자.
private boolean isRule1Satisfied() {
int[] cnt = new int['Z'-'A'+1];
for (int i = 0; i < n; i++) {
cnt[a.charAt(i)-'a']++;
cnt[b.charAt(i)-'a']--;
}
for (int i = 0; i < 'Z'-'A'+1; i++) {
if (cnt[i] != 0)
return false;
}
return true;
}
2. 두 단어의 첫 글자와 마지막 글자는 서로 동일해야 한다.
이건 간단하다. 말 그대로 비교해주면 된다.
private boolean isRule2Satisfied() {
return a.charAt(0) == b.charAt(0) && a.charAt(n-1) == b.charAt(n-1);
}
3. 각 단어에서 모음(a, e, i, o, u)을 제거한 문자열은 동일해야 한다.
직접 character 단위로 보면서 a,e,i,o,u를 빼줘도 되지만 이런 경우에 제일 간단한건 정규식을 쓰는것이다. 정규식으로 a,e,i,o,u를 제거한 후 두 문자열을 비교했다.
private boolean isRule3Satisfied() {
String replacedA = a.replaceAll("[aeiou]", "");
String replacedB = b.replaceAll("[aeiou]", "");
return replacedA.equals(replacedB);
}
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private int n;
private String a, b;
public static void main(String[] args) throws Exception {
new Main().solution();
}
public void solution() throws Exception {
n = Integer.parseInt(br.readLine());
a = br.readLine();
b = br.readLine();
System.out.println(isRule1Satisfied() && isRule2Satisfied() && isRule3Satisfied() ? "YES" : "NO");
}
private boolean isRule1Satisfied() {
int[] cnt = new int['Z'-'A'+1];
for (int i = 0; i < n; i++) {
cnt[a.charAt(i)-'a']++;
cnt[b.charAt(i)-'a']--;
}
for (int i = 0; i < 'Z'-'A'+1; i++) {
if (cnt[i] != 0)
return false;
}
return true;
}
private boolean isRule2Satisfied() {
return a.charAt(0) == b.charAt(0) && a.charAt(n-1) == b.charAt(n-1);
}
private boolean isRule3Satisfied() {
String replacedA = a.replaceAll("[aeiou]", "");
String replacedB = b.replaceAll("[aeiou]", "");
return replacedA.equals(replacedB);
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 27453 - 귀엽기만 한 게 아닌 한별 양 (java) (0) | 2023.02.24 |
---|---|
[자바] 백준 12764 - 싸지방에 간 준하 (java) (0) | 2023.02.24 |
[자바] 백준 27315 - 틀리는 건 싫으니까 쉬운 문제에 올인하려고 합니다 (java) (0) | 2023.02.17 |
[자바] 백준 18310 - 안테나 (java) (0) | 2023.02.16 |
[자바] 백준 18248 - 제야의 종 (java) (0) | 2023.02.15 |
댓글