본문 바로가기
알고리즘/알고리즘 설명

20230905 [Java] 문제풀이

by JayAlex07 2023. 9. 8.

20230905 [Java] 문제풀이

 

[프로그래머스] 괄호 회전하기

 

.substring 을 이용해서, 문자열을 슬라이싱 하면서 문자열을 한바퀴 돌린다

 

한바퀴 돌리면서 stack을 사용하여 괄호 문자열이 유효한지 확인해준다

import java.util.*;

class Solution {

    public static boolean isCorrect(String str) {
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '(' || str.charAt(i) == '[' || str.charAt(i) == '{') {
                stack.push(str.charAt(i));   
            } else {
                if (stack.isEmpty()) return false;

                if ((str.charAt(i) == ')' && stack.peek() != '(') ||
                   (str.charAt(i) == ']' && stack.peek() != '[')  ||
                   (str.charAt(i) == '}' && stack.peek() != '{')) {
                    return false;
                }  else if ((str.charAt(i) == ')' && stack.peek() == '(') ||
                            (str.charAt(i) == ']' && stack.peek() == '[')  ||
                             (str.charAt(i) == '}' && stack.peek() == '{')) {
                    stack.pop();
                }
            }
        }

        if (!stack.isEmpty()) return false;

        return true;
    }

    public int solution(String s) {
        int answer = 0;

        for (int i = 0; i < s.length(); i ++) {
            String s1 = s.substring(0, i);
            String s2 = s.substring(i, s.length());

            if (isCorrect(s2 + s1)) answer ++;
        }

        return answer;
    }
}

 

[프로그래머스] 순위 검색

 

새로운 2중 배열로 info와 query를 만든다

그리고 두 배열을 비교하면 되는데, 효율성이 떨어진다...

import java.util.*;
class Solution {
    public int[] solution(String[] info, String[] query) {
        int[] answer = new int[query.length];

        ArrayList<String[]> qList = new ArrayList<>();
        ArrayList<String[]> infoList = new ArrayList<>();

        // query에 문자열을 배열로 만들어 qList에 넣는다
        for (String str : query) {
            str = str.replace("and ", "");
            String[] queryList = str.split(" ");
            qList.add(queryList);
        }

        for (String str : info) {
            String[] iList = str.split(" ");
            infoList.add(iList);
        }

        for (int i = 0; i < qList.size(); i++) {
            int count = 0;
            String lang = qList.get(i)[0];
            String devType = qList.get(i)[1];
            String career = qList.get(i)[2];
            String food = qList.get(i)[3];
            int score = Integer.parseInt(qList.get(i)[4]);

            for (int j = 0; j < infoList.size(); j++) {

                if (!lang.equals("-")) {
                    if (!lang.equals(infoList.get(j)[0])) {
                        continue;
                    }
                }

                if (!devType.equals("-")) {
                    if (!devType.equals(infoList.get(j)[1])) {
                        continue;
                    }
                }

                if (!career.equals("-")) {
                    if (!career.equals(infoList.get(j)[2])) {
                        continue;
                    }
                }

                if (!food.equals("-")) {
                    if (!food.equals(infoList.get(j)[3])) {
                        continue;
                    }
                }

                if (score > Integer.parseInt(infoList.get(j)[4])) {
                    continue;
                }
                count ++;
            }

            answer[i] = count;
        }

        return answer;
    }
}

 

효율성까지 맞추려면, 받은 info에서 모든 경우의 수를 map에다가 넣는다

  • key로는 경우의 값, value는 코딩 테스트 점수로 저장을 한다
  • 예) java backend junior pizza 150
    • ---- = 150
    • ---pizza = 150
    • --juniorpizza = 150 등등

 

그리고 더 빠른 검색을 위해 BinarySearch를 사용한다

  • BinarySearch를 하기 전에는 모든 value들을 sort 해야 한다
    • value들은 모두 숫자로 된 리스트로 저장되어 있다
import java.util.*;

class Solution {

    static HashMap<String, ArrayList<Integer>> map = new HashMap<>();

    public void possibleChoice(String[] array, int count, String str) {

        if (count == 4) {
            if (!map.containsKey(str)) {
                ArrayList<Integer> numList = new ArrayList<>(); 
                map.put(str, numList);
            }
            map.get(str).add(Integer.parseInt(array[4]));
            return;
        }

        possibleChoice(array, count + 1, str + "-");
        possibleChoice(array, count + 1, str + array[count]);

    }

    public int binarySearch(ArrayList<Integer> list, int score) {
        int left = 0;
        int right = list.size() - 1;

        while (left <= right) {
            int mid = (left + right) / 2;

            if (list.get(mid) >= score) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return list.size() - left;
    }

    public int[] solution(String[] info, String[] query) {
        int[] answer = new int[query.length];

        for (int i = 0; i < info.length; i++) {
            String[] stringArray = info[i].split(" ");
            possibleChoice(stringArray, 0, "");
        }

        for (String key : map.keySet()) {
            Collections.sort(map.get(key));
        }

        for (int i = 0; i < query.length; i++) {
            String newQuery = query[i].replace("and ", "");

            String[] queryArray = newQuery.split(" ");

            int score = Integer.parseInt(queryArray[4]);

            String compareString = queryArray[0] + queryArray[1] + queryArray[2] + queryArray[3];

            if (map.containsKey(compareString)) {
                ArrayList<Integer> scoreList = map.get(compareString);

                answer[i] = binarySearch(scoreList, score);
            }
        }

        return answer;
    }
}

'알고리즘 > 알고리즘 설명' 카테고리의 다른 글

20230912 [Java] 문제풀이  (0) 2023.09.12
20230906 [Java] 문제풀이  (0) 2023.09.08
20230904 [Java] 문제풀이  (0) 2023.09.08
20230829 [Java] 문제풀이  (0) 2023.08.29
20230828 [Java] 문제풀이  (1) 2023.08.28