본문 바로가기
PS/BOJ

[자바] 백준 25178 - 두라무리 휴지 (java)

by Nahwasa 2023. 2. 18.

 문제 : 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);
    }
}

댓글