작년 나름 릿코드 열심히 들어가서 문제를 풀었다고 생각했는데 올해 처음 들어가니 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

+ Recent posts