| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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 | 
- DP
 - 리트코드
 - string
 - priority queue
 - PCCP
 - recursion
 - binary tree
 - hashset
 - dfs
 - 부분배열
 - coding
 - Algorithm
 - two pointers
 - 브루트포스
 - greedy
 - ArrayList
 - HashMap
 - Array
 - 우선순위 큐
 - 재귀함수
 - leetcode
 - 알고리즘
 - 깊이우선탐색
 - Java
 - programmers
 
- Today
 
- Total
 
지식창고
[Java] LeetCode 953. Verifying an Alien Dictionary 본문
[Java] LeetCode 953. Verifying an Alien Dictionary
문 제 :
문자열들의 배열 words가 주어진다.
일반적인 사전적 순서가 아닌 재정의 된 사전 문자열 order가 주어진다.
words에 들어있는 단어들이 order에 따라 정렬되어 있는지 확인해라.
{ 1 <= words.length <= 100 }
{ 1 <= words[i].length <= 20 }
{ order.length == 26}
Example )
Input: words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz"
Output: true
Explanation: 
As 'h' comes before 'l' in this language, then the sequence is sorted.
//////////////////////////////////////////////////////////
Input: words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz"
Output: false
Explanation: 
The first three characters "app" match, and the second string is shorter (in size.)
According to lexicographical rules "apple" > "app", 
because 'l' > '∅',
where '∅' is defined as the blank character which is less than any other character.
접   근 : 
사전에 나와있는 각 알파벳의 index를 기준으로 단어들이 정렬되어 있는지 확인한다.
해   결 : 
단어 2개를 비교하는 함수를 만든다. - solve
함수에서는 두 단어를 order에 따라 비교하게 된다.
두 단어의 첫 글자부터 비교하여 만약 글자가 다르다면, 바로 판별할 수 있다.
뒤에 오는 글자가 사전적으로 더 뒤에 나오면 true인 것이다.
그게 아니고 만약에 두 글자가 같다면, 그 다음 단어를 비교하게 된다.
이런식으로 더 짧은 단어의 끝까지 비교하게 된다.
만약 계속 두 단어가 같아서 return 에 걸리지 않았다면,
상황은 두 가지로 볼 수 있다.
1. 두 단어가 완전히 일치 ex) "app", "app"
2. 두 단어가 상관관계에 위치 ex) "app", "apple"
두 가지 상황을 판별하는 방법은 간단하다.
두 단어의 길이를 보면 되는 것이다.
만약 두 단어의 길이가 같다면, 완전히 일치하는 단어이므로 true를 반환한다.
그렇지 않다면, 더 짧은 단어가 앞에 와야하므로 단어1의 길이가 단어2의 길이보다 짧으면 true를 반환해준다.
위 과정을 words에 있는 단어들에게 실행시켜 주면, 하나라도 false가 반환된다면 정렬되어 있지 않다고 볼 수 있다.
solve 함수 구현
public boolean solve(String word1, String word2, String order){
    // 두 단어 중 더 짧은 단어 기준
    int len = (word1.length() >= word2.length()) ? word2.length() : word1.length();
    int temp=0;
    for(int j=0; j<len; j++){
        if(order.indexOf(word1.substring(j, j+1)) < order.indexOf(word2.substring(j, j+1))){
            return true;
        }
        else if(order.indexOf(word1.substring(j, j+1)) == order.indexOf(word2.substring(j, j+1))){
            temp++;
        }
        else{
            return false;
        }
    }
    // 두 단어의 길이가 같고 계속 똑같으면
    if(temp == len && word1.length() == word2.length()) return true;
    // 두 단어가 포함관계에 있고 길이가 짧은게 먼저 나왔다면
    else if(temp == len && word1.length() < word2.length()) return true;
    return false;
}
결   과  :
class Solution {
    public boolean isAlienSorted(String[] words, String order) {
        // 단어 1, 단어 2 비교 -> 첫 번째 인덱스 부터 끝까지 비교하는데 포함되는거면 짧은게 앞으로 와야함
        for(int i=0; i<words.length-1; i++){
            if(!solve(words[i], words[i+1], order)){
                return false;
            }
        }
        return true;
    }
    public boolean solve(String word1, String word2, String order){
        // 두 단어 중 더 짧은 단어 기준
        int len = (word1.length() >= word2.length()) ? word2.length() : word1.length();
        int temp=0;
        for(int j=0; j<len; j++){
            if(order.indexOf(word1.substring(j, j+1)) < order.indexOf(word2.substring(j, j+1))){
                return true;
            }
            else if(order.indexOf(word1.substring(j, j+1)) == order.indexOf(word2.substring(j, j+1))){
                temp++;
            }
            else{
                return false;
            }
        }
        // 두 단어의 길이가 같고 계속 똑같으면
        if(temp == len && word1.length() == word2.length()) return true;
        // 두 단어가 포함관계에 있고 길이가 짧은게 먼저 나왔다면
        else if(temp == len && word1.length() < word2.length()) return true;
        return false;
    }
}'Algorithm > Leetcode' 카테고리의 다른 글
| [Java] LeetCode 1162. As Far from Land as Possible (0) | 2023.02.10 | 
|---|---|
| [Java] LeetCode 6. Zigzag Conversion (0) | 2023.02.03 | 
| [Java] LeetCode 1626. Best Team With No Conflicts (0) | 2023.02.01 | 
| [Java] LeetCode 1137. N-th Tribonacci Number (0) | 2023.01.30 | 
| [Java] LeetCode 352. Data Stream as Disjoint Intervals (0) | 2023.01.28 |