본문 바로가기
알고리즘 문제 풀이

1897. Redistribute Characters to Make All Strings Equal

by 가나무마 2021. 6. 14.
728x90

[링크](https://leetcode.com/problems/redistribute-characters-to-make-all-strings-equal/)

각 문자열 배열들의 문자를 옮길 수 있습니다.

문자를 옮겨서 모두 같은 문자열로 바꿀 수 있으면 true 아니면 false를 리턴합니다.

"abc","aabc","bc"가 있으면 aabc의 a를 bc의 붙이면 모든 문자열이 abc가 됨. 따라서 true를 리턴.

문제 처음 볼 때 단 한 번만 바꿀 수 있는 걸로 착각해서 문제 못풀었음.

친구랑 풀다가 여러 번 바꿀 수 있단 거 알고 다시 풀었음.

[나름대로 다른 방법으로 풀어본 코드]

import java.util.*;

class Solution {
    public boolean makeEqual(String[] words) {
        StringBuilder sb = new StringBuilder();

        for (String str : words) {
            //모든 문자열을 한 문자열로 만듬.
            sb.append(str);
        }

        //문자열의 배열 길이로 총 글자가 나눠떨어지지 않으면 false.
        //예를 들어 aabbc면 5글자인데 배열의 길이가 3개면 2,2,2로 나눌 수 없음.
        if (sb.length() % words.length != 0) {
            return false;
        }

        //문자의 정렬을 위해서 char 배열로 만든 후 정렬함.
        String str = new String(sb);
        char[] charArray = str.toCharArray();
        Arrays.sort(charArray);

        //문자열 배열의 길이를 주기로 체크함.
        for (int startIndex = 0; startIndex < charArray.length; startIndex += words.length) {
            if (charArray[startIndex] != charArray[startIndex + words.length-1]) {
                return false;
            }
        }

        return true;
    }
}

위의 풀이법은 똑같은 문자가 words.length의 배수만큼 있어야 되는 거에 주목해서 풀었음.
"abc","aabc","bc"로 치면 a : 3, b : 3, c : 3 이렇게 나눠져야 하는 갯수의 배수만큼 있음.

[해쉬맵을 이용한 친구 코드]

import java.util.*;

class Solution {
    public boolean makeEqual(String[] words) {
        HashMap<Character, Integer> map = new HashMap<String, Integer>();
        StringBuilder sb = new StringBuilder();

        for(String word : words) {
            sb.append(word);
        }
        if(sb.length() % words.length != 0) return false;

        for(int i=0; i<sb.length(); i++) {
            map.put(sb.charAt(i), map.getOrDefault(sb.charAt(i), 0)+1);
        }

        for(int val : map.values()) {
            if(val % words.length != 0) return false;
        }

        return true;
    }
}

프로그래머스에서 완주하지 못한 선수랑 비슷하게 풀었음.
Map에 key는 문자로 value는 그 문자의 개수를 넣어줌.

[리트코드 100%답안]

class Solution {
    public boolean makeEqual(String[] words) {
        int[] c = new int[26];
        for (String word: words) {

            for (char ch: word.toCharArray()) {

                c[ch - 'a']++;
            }
        }
        for (int frequency: c) {
            if (frequency % words.length != 0)
                return false;
        }
        return true;
    }
}

알파벳의 숫자는 26개로 정해져 있으므로 그냥 알파벳 크기만한 배열을 생성해줌.
이 배열은 각 알파벳의 개수를 넣어줌.

728x90
반응형