작년 나름 릿코드 열심히 들어가서 문제를 풀었다고 생각했는데 올해 처음 들어가니 100 일 짜리 뱃지 를 받았다 ㅎㅎ
내년 에는 200 일 짜리 뱃지 를 받아보도록 노력해보자.
944. Delete Columns to Make Sorted
주어진 문자 를 나열하고 세로로 읽었을때 사전 순이 되지 않는 경우를 판별하는 문제이다. 모든 문자열의 길이가 똑같다는 전제조건 이 있어서 이지 난이도라고 생각된다.
class Solution {
public int minDeletionSize(String[] strs) {
int answer = 0;
int len = strs[0].length();
for(int i=0;i<len;i++){
for(int j=1;j<strs.length;j++){
char a = strs[j].charAt(i);
char b = strs[j-1].charAt(i);
if( a < b){
answer++;
break;
}
}
}
return answer;
}
}
배열의 최대 크기 1000, 문자의 최대길이 100 => 2중 포문 돌려도 문제없다고 생각해서 바로 작성했다.
최초 작성시 에 i, j 를 이상하게 지정을 해버리는 바람에 indexOutOfRange 에러가 났다. 언제쯤 이런 잔 실수를 없앨수 있는지...
그래도 제출하니 바로 통과 가 되긴한다.
대부분 의 solution code 들도 이중포문 을 이용해서 작성 되어있다.
520. Detect Capital
주어지는 문제 의 조건 에 맞춰서 구현만 해주면 된다.
class Solution {
public boolean detectCapitalUse(String word) {
char first = word.charAt(word.length()-1);
if('A' <= first && first <= 'Z'){
for(char c : word.toCharArray()){
if(!('A' <= c && c <= 'Z')) return false;
}
}else{
for(int i=word.length()-1;i>=0;i--){
char c = word.charAt(i);
if(!('a' <= c && c <= 'z') && (i!= 0)) return false;
}
}
return true;
}
}
그냥 문제 에서 주어진 그대로 구현했다.
이 방법 외에는 regex 가 있다.
class Solution {
public boolean detectCapitalUse(String word) {
return word.matches("[A-Z]*|[A-Z]?[a-z]*");
}
}
대문자 이거나 혹은 대문자가 있거나 없거나 그리고 나머지 소문자 로 채우면 된다.
이것 외에 괜찮다고 생각하는 코드가 있어서 들고왔다.
public boolean detectCapitalUse(String word) {
if (word.length() < 2) return true;
if (word.toUpperCase().equals(word)) return true;
if (word.substring(1).toLowerCase().equals(word.substring(1))) return true;
return false;
}
반대로 true 가 되는 조건만 을 subString 과 toUpperCase 를 이용해 깔끔하게 코드 를 구사했다.
그러나 toUpperCase 의 작동하는 방식을 보면 내부적으로 forLoop 를 돌려서 내부로직 수행후 String 을 리턴해준다.
하물며 subString 은 어떤가 String 은 불변 이다 따라서 클래스 내부 의 value 바이트 코드 배열을 arrayCopy 를 수행해 새로운 스트링을 만들어 뱉어준다. 즉 for 를 한번더 돈다는 의미이다. eqaul 또한 하나씩 비교하기 위해 forLoop 을 돈다
이렇게 수행 로직 만 보고 생각한다면 느릴수 밖에없다. 다만 이해하기 쉽다.
실제 업무에 투입되어 작성한코드 라면 사실 나는 이 코드 처럼 작성하고 싶다. 성능상의 문제가 있는 것 이 아니라면 코드 자체를 이렇게 두고 유지할것이다. 왜 ? 읽기 쉬운 코드가 최고니깐.
290. Word Pattern
주어진 패턴에 맞는 스트링 값을 찾아 반환 해주면 되는 문제이다.
class Solution {
public boolean wordPattern(String pattern, String s) {
Map<Character,String> map = new HashMap();
Set<String> set = new HashSet();
int len = pattern.length();
String[] arr = s.split(" ");
if(len != arr.length) return false;
for(int i=0;i<len;i++){
char p = pattern.charAt(i);
if(!map.containsKey(p) && set.add(arr[i])){
map.put(p,arr[i]);
}
if(!map.getOrDefault(p,"ㄱ").equals(arr[i])) return false;
}
return true;
}
}
쫌 과하다 싶을 만큼 자료구조 를 선언해서 사용했다. Set 없이 그냥 map.containsValue 를 사용해도 됬었다. 다만 containsValue 를 사용해서 forLoop 를 두번돌게 하고 싶지 않았다.
Map 을 두번써서 좌우로 맵핑 한 사람도 있고, 다양한 풀이방법 이 있다.
본인이 선호하는 방법으로 작성하면 된다고 생각한다.
이렇게 3문제를 풀어도 2,3 번 같은경우는 2~3번씩 제출을 더 했다. 로직 의 오류, 예외케이스 핸들링 생략 등이 그 이유이다.
언제쯤 풀어야 이런 이지 난이도 를 한번에 클리어 할수 있을까....
'PS > LeetcCode' 카테고리의 다른 글
LeetCode Daily 문제풀기 (0) | 2023.01.05 |
---|---|
1월4일 문제 풀기 (2) | 2023.01.04 |
Binary Tree Maximum Path Sum (0) | 2022.12.11 |
1339. Maximum Product of Splitted Binary Tree (0) | 2022.12.10 |
Easy 문제 풀기 Day1(79/610) (0) | 2022.12.03 |