Solution 1) 내 풀이
class Solution {
    public static boolean checkNum(String[] tmp, int i) {
        boolean isNum = true;
        try {
            Integer.parseInt(tmp[i]);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    public int solution(String my_string) {
        String[] tmp = my_string.split(" ");
        int answer = 0;
        
        boolean isMinus = false;
        for (int i = 0; i < tmp.length; i++) {
            if (!checkNum(tmp, i)) {
                isMinus = tmp[i].equals("-") ? true : false;
            }
            if (checkNum(tmp, i) && !isMinus) {
                answer += Integer.parseInt(tmp[i]);
            } else if (checkNum(tmp, i) && isMinus) {
                answer -= Integer.parseInt(tmp[i]);
            }
        }
        return answer;
    }
}
코드 및 문제 리뷰

문자열 안의 연산을 풀어내 반환하는 문제이다. 여기서 문제는 연산식이 int형의 배열이 아닌 문자열안에 "5 + 9"와 같이 들어있다는 것이다. 숫자와 연산자는 띄어쓰기로 구분 돼 있다.

 

물론 이번 문제는 숫자 두개와 연산자 한개로만 이뤄져 있어 비교적 단순하게도 풀 수 있었다.

그러나 이보다 조금 복잡한 문제는 연산해야할 수가 음수인 경우도 있기에 checkNum 메소드를 만들어 사용해 봤다.

그 안에는 try-catch문을 사용해 Integer.parseInt가 안되는 요소는 false를 반환하게 만들어 수를 더하거나 빼는 것이 아닌,

boolean형의 isMinus를 바꿔주는데 사용하고 숫자인 경우(Integer.parseInt가 되는 경우) true를 반환해 수를 더하거나 빼게 만들었다.

 

굳이굳이 다른 메소드까지 만들며 풀었기에 좋은 풀이식은 아닌듯 하지만 예외처리까지 해보는 등

많은 연습이 됐던 문제였다.

Solution 1) 다른 사람의 풀이
import java.util.*;

class Solution {
    public int solution(int[] array, int n) {
        int answer = 0;
        Arrays.sort(array);
        for(int i = 1 ; i < array.length ; i++){
            if(Math.abs(n-array[0]) > Math.abs(n-array[i])){
                array[0] = array[i];
            }
        }
        answer = array[0];
        return answer;
    }
}
코드 및 문제 리뷰

간단한 문제로 보였으나 현재의 나에겐 조금 버거웠다.

여러 답안들을 참고했고 그중 처음보는 방식의 가장 참신해보이는 (내 마음에 드는) 답안을 가져왔다.

 

배열과 n이 주어졌을 때 배열안의 요소중 n과 가장 가까운 요소를 찾되, 가장 가까운 값이 두개일 경우

더 작은 값을 반환해야하는 문제이다.

여기서 작은 값이 두개일 경우란, n에 가장 근접한 수 +1 또는 -1과 같이 절대값이 같은 수가 있을 경우를 뜻한다.

 

답안을 보면 요소0번을 기준으로 두고 계속해서 타요소와 비교를 시킨다. 

그때에 0번 요소는 고정값이 아닌, 0번 요소보다 작았던 요소의 값으로 업데이트 시킨다.

(조건문 안의 조건을 이런식으로 변경시킬 수 있는지 몰랐다)

 

결국 이 조건문을 거쳐 반복문을 모두 돌게 되면 n과 가장 가깝되 더 작은 값을 가져오게 된다.

 

비교해야할 대상을 정하는데 어려움이 있던 문제였다.

비교해야할 대상 및 가깝되 가장 작은 수를 정하기에 어려움이있었는데,

위와 같이 조건문의 대상을 업데이트시키며 나아가는 방식은 내가 고민한

것들을 한번에 없애줄 수 있는 참신한 방법이었다. 꼭 활용해보자.

Solution 1) 내 풀이

import java.util.HashSet;
import java.util.Set;

class Solution {
    public String solution(String my_string) {
        char[] chars = my_string.toCharArray();
        Set<Character> set = new HashSet<>();
        StringBuilder answer = new StringBuilder();

        for (char c : chars) {
            if (set.add(c)) {
                answer.append(c);
            }
        }

        return answer.toString();
    }
}
집중해야할 키워드로는 '중복', 새로운 '문자열'의 return이었다.
'중복'은 set을, 새로운 '문자열'은 StringBuilder의 활용에 유리하다.

 

Solution 1) 내 풀이
class Solution {
    public int solution(String s) {
        int answer = 0;
        String[] tmp = s.split(" ");

        for (int i = 0; i < tmp.length; i++) {
            if (tmp[i].equals("Z")) {
                answer -= Integer.parseInt(tmp[i - 1]);
            } else {
                answer += Integer.parseInt(tmp[i]);
            }
        }
        return answer;
    }
}
Solution 2) 다른 사람의 풀이_stack 활용
import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        Stack<Integer> stack = new Stack<>();

        for (String w : s.split(" ")) {
            if (w.equals("Z")) {
                stack.pop();
            } else {
                stack.push(Integer.parseInt(w));
            }
        }
        for (int i : stack) {
            answer += i;
        }
        return answer;
    }
}
아마 문제의 의도는 stack을 활용하게 했던 게 아닌가 싶다.
stack에 최적화 돼있던 문제인 것 같다. (직전의 요소를 빼야하는 조건이 있기에)
편한 방법만 고수하지 말고 다방면으로 생각하고 활용할 수 있어야겠다.

 

Solution 1) 내 풀이
class Solution {
    public String solution(String my_string, int s, int e) {
        StringBuilder sb = new StringBuilder(my_string);
        String sub = sb.substring(s, e + 1);
        StringBuilder reverse = new StringBuilder(sub).reverse();
        sb.replace(s, e + 1, reverse.toString());
        
        return sb.toString();
    }
}

 

1) 주어진 문자열 StringBuilder 만들기 (sb)
2) 뒤집을 substring 임시 문자열 만들기 (sub) > 인덱스 구간( s 부터 e까지) 문자열에 넣기
3) reverse StringBuilder 만들기 > 2에서 만든 뒤집을 구간을 reverse 메서드로 뒤집기
4) 1에서 만든 StringBuilder sb에 3에서 만든 reverse 구간 바꾸기 (replace 메서드)
(4에서 toString();은 없어도 상관 없다. 컴파일러가 자동으로 String으로 변환 해주지만 가독성 및 혼동 방지를 위해 들어간다.)

 

Solution 1) 내 풀이
class Solution {
    public int solution(String my_string, String is_suffix) {

        int myIdx = my_string.length() - 1;
        int isIdx = is_suffix.length() - 1;
        int answer = 0;

        for (int i = 0; i < is_suffix.length(); i++) {
            answer = 0;
            // 원문과 비교자의 끝 문자가 같지 않다면 끝내기 || 비교자가 더 길다면 끝내기
            if (is_suffix.charAt(isIdx) != my_string.charAt(myIdx) || myIdx < isIdx) {
                break;
            }else {
                if (is_suffix.charAt(i) == my_string.charAt(myIdx - isIdx + i)) {
                    answer = 1;
                }
            }
        }
        return answer;
    }
}
시행착오) else 의 if (is_suffix.charAt(i) == my_string.charAt(myIdx - isIdx + i)) 조건
class Solution {
    public int solution(String my_string, String is_suffix) {

        int myIdx = my_string.length() - 1;
        int isIdx = is_suffix.length() - 1;
        int answer = 0;

        for (int i = 0; i < is_suffix.length(); i++) {
            answer = 0;
            if (is_suffix.charAt(isIdx) != my_string.charAt(myIdx) || myIdx < isIdx) {
                break;
            }else {
                if (is_suffix.charAt(i) == my_string.charAt(myIdx - isIdx)) {
                    answer = 1;
                }
            }
        }
        return answer;
    }
}
처음에 else의 조건문에 is_suffix의 문자와 비교하려는 my_string의 문자를 myIdx - isIdx로 뒀다.

반복문을 돌며 하나하나 비교해서 확인이 돼야하는데 그렇지 못해 에러가 났음을 확인하고 나중에 (밥먹고 나니 비로소..)보이게 돼 수정 후 성공 할 수 있었다.
Solution 2) 다른 사람의 풀이 _ endsWith 메서드 사용
class Solution {
    public int solution(String my_string, String is_suffix) {
        if(my_string.endsWith(is_suffix)) {
            return 1;
        } else {
            return 0;
        }
    }
}

접미사 메서드가 있었당.. 

class Solution {
    public int solution(String my_string, String is_suffix) {
        return my_string.endsWith(is_suffix) ? 1 : 0;
    }
}

그래서 활용해봤다.. 걍 요렇게 끝낼 수 있다 또 배웠다 ㅜㅜ

+ Recent posts