일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 깊이우선탐색
- 알고리즘
- string
- HashMap
- Java
- binary tree
- Algorithm
- PCCP
- two pointers
- Array
- 브루트포스
- 부분배열
- greedy
- priority queue
- 우선순위 큐
- 리트코드
- dfs
- 재귀함수
- programmers
- coding
- leetcode
- recursion
- hashset
- ArrayList
- DP
- 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 |