728x90

[문제 설명]

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}  ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

[입출력 예]

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

 

[차근 차근 생각해보기]

  1. s를 이어 붙여서 회전한 모습을 만든다.
  2. isCorrect 함수를 만들어 온전한 괄호인지 판별한다.
    • 열린 괄호일 경우 stack에 넣어준다.
    • 닫힌 괄호이고 stack에 들어간 괄호와 짝이 맞을 경우 stack에 있는 괄호는 빼준다.
    • 만약 닫힌 괄호가 열린 괄호보다 먼저 들어갈 경우 return false를 해준다.
  3. isCorrect 함수에서 true일 경우 answer에 1을 더해주고 return 해준다.

 

[코드]

import java.util.*;
class Solution {
    public int solution(String s) {
        int answer = 0;
        
        String newStr = s + s;
        for(int i = 0; i < s.length(); i++){
            if(isCorrect(newStr.substring(i, s.length() + i))){
                answer += 1;
            }
        }
        
        return answer;
    }
    
    boolean isCorrect(String s){
        String[] str = s.split("");
        Stack<String> stack = new Stack<>();
        
        for(int i = 0; i < str.length; i++){
            if(str[i].equals("(") || str[i].equals("[") || str[i].equals("{")){
                stack.push(str[i]);
            }else if(stack.empty()){
                return false;
            }else if(str[i].equals(")") && stack.peek().equals("(")){
                stack.pop();
            }else if(str[i].equals("]") && stack.peek().equals("[")){
                stack.pop();
            }else if(str[i].equals("}") && stack.peek().equals("{")){
                stack.pop();
            }
        }
        
        if(stack.empty()){
            return true;
        }
        
        return false;
    }
}

 

[반성할 점]

괄호 문제는 스택으로 푸는 문제이다.

회전을 위해 문자열 s를 한번 더 더한다는 아이디어가 정말 흥미로웠다.

아이디어를 주신분께선 경험의 차이라는데 과연 경험의 차이가 맞을까 의심된다..

 

아직까지 생각하는 코드를 구현해내는 것이 많이 부족하다.

알고리즘 이외에도 다른 문제를 풀면서 구현력을 기르도록 노력해야겠다.

728x90
728x90

[문제 설명]

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

 

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.
Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.

 

[입출력 예]

scoville K return
[1, 2, 3, 9, 10, 12] 7 2

 

[차근 차근 생각해보기]

  1. 스코빌 지수가 K이상이 되어야 하기 때문에 PriorityQueue에 넣어준다.(오름차순 정렬이 됨)
  2. 가장 작은 수에서 두번째로 작은 수 * 2를 더해준다.
  3. 계속 반복하면서 첫번째 원소가 K이상일때 멈춰준다.

 

[코드]

import java.util.*;
class Solution {
    public int solution(int[] scoville, int K) {
        PriorityQueue<Integer> lowList = new PriorityQueue<>();

        for (int i = 0; i < scoville.length; i++) {
            lowList.add(scoville[i]);
        }

        int answer = 0;
        while (lowList.peek() < K) {
            if (lowList.size() < 2) {
                return -1;
            }else{
                answer++;
                lowList.add(lowList.poll() + (lowList.poll() * 2));
            }
        }
        return answer;
    }
}

 

 

[반성할 점]

알고 보면 되게 간단한 문제였는데 우선순위 큐라는 존재를 몰라 복잡하게 풀려다가 못풀었던 문제였다.

이제는 자료구조를 공부할 때이다.

언능 공부해서 그동안 풀었던 문제들도 다시 풀어보고 싶다..!

728x90
728x90

[문제 설명]

숫자나라 기사단의 각 기사에게는 1번부터 number까지 번호가 지정되어 있습니다. 기사들은 무기점에서 무기를 구매하려고 합니다.

 

각 기사는 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기를 구매하려 합니다. 단, 이웃나라와의 협약에 의해 공격력의 제한수치를 정하고, 제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는 협약기관에서 정한 공격력을 가지는 무기를 구매해야 합니다.

 

예를 들어, 15번으로 지정된 기사단원은 15의 약수가 1, 3, 5, 15로 4개 이므로, 공격력이 4인 무기를 구매합니다. 만약, 이웃나라와의 협약으로 정해진 공격력의 제한수치가 3이고 제한수치를 초과한 기사가 사용할 무기의 공격력이 2라면, 15번으로 지정된 기사단원은 무기점에서 공격력이 2인 무기를 구매합니다. 무기를 만들 때, 무기의 공격력 1당 1kg의 철이 필요합니다. 그래서 무기점에서 무기를 모두 만들기 위해 필요한 철의 무게를 미리 계산하려 합니다.

 

기사단원의 수를 나타내는 정수 number와 이웃나라와 협약으로 정해진 공격력의 제한수치를 나타내는 정수 limit와 제한수치를 초과한 기사가 사용할 무기의 공격력을 나타내는 정수 power가 주어졌을 때, 무기점의 주인이 무기를 모두 만들기 위해 필요한 철의 무게를 return 하는 solution 함수를 완성하시오.

 

[입출력 예]

number limit power
result
5 3 2 10
10 3 2 21

 

[차근 차근 생각해보기]

  1. 1부터 number까지 각각의 약수의 개수를 구하기
    • 1의 약수 1개, 2의 약수 2개, 3의 약수 2개 등등
  2. 약수의 개수가 limit보다 크면 power로 바꿔준다.(제한된 수보다 크면 공격력이 power인 무기를 구매해야하기 때문)
  3. answer에 cnt를 더해주고 return해준다.

 

[코드]

class Solution {
    public int solution(int number, int limit, int power) {
        int answer = 0;
        for (int i = 1; i <= number; i++) {
            int cnt = 0;
            for (int j = 1; j * j <= i; j++) {
                if (j * j == i) {
                    cnt++;
                }else if(i % j == 0){
                    cnt += 2;
                }
            }
            if(cnt > limit){
                cnt = power;
            }
            answer += cnt;
        }
        return answer;
    }
}

 

[반성할 점]

약수의 개수 구하는 방법을 몰라 처음에 많이 헤맸다.

단순히 모든 수를 돌면서 약수를 구해보았는데 시간 초과가 나서 이리저리 찾아보다가

1 ~ n의 제곱근까지 돌면서 약수이면 * 2를 해주고 n의 제곱근인 경우 1개를 더해주는 방법을 찾게 되었다.

그랬더니 시간 초과 없이 잘 풀리게 되었다.

약수 구하는 방법을 조금 더 공부해보고 기록해둬야겠다.

728x90
728x90

[문제 설명]

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 

[입출력 예]

num total result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]

 

[차근 차근 생각해보기]

  1. total / num을 하여 중앙값을 구해준다.
  2. (num - 1) / 2을 빼주면 첫번째 수를 구할 수 있다.
  3. 또는 등차수열의 공식을 이용한다.

 

[코드]

<수정전>

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        int start = (total / num) - ((num - 1) / 2);
        for (int i = 0; i < num; i++) {
            answer[i] = start;
            start++;
        }
        return answer;
    }
}

 

 

<수정후>

class Solution {
    public int[] solution(int num, int total) {
        int[] answer = new int[num];
        for (int i = -100; i <= 100 ; i++) {
            int result = (num * (i + ((i + num) - 1))) / 2;
            if (result == total) {
                for (int j = 0; j < answer.length; j++) {
                    answer[j] = i + j;
                }
            }
        }
        return answer;
    }
}

 

[반성할 점]

처음에 짝수 홀수를 나누어 연속된 수의 합을 구하는 코드를 작성했었는데,

이렇게 하면 음수일때 어떻게 처리해야할지 몰라 결국 다른 사람의 풀이를 보고 풀었다.

 

그러다가 등차수열로 풀어보고 싶어서 다시 구현을 해보았다.

등차수열의 공식  (항수 * (첫째항 + 마지막항)) / 2이다.

 

여기서 항수는 num, 첫째항과 마지막항은 - 100부터 100까지 반복문을 돌면서 구할 수 있도록 하였다.

처음부터 등차수열을 이해하고 풀었으면 좋았을텐데..!

 

이런 수학적 공식도 보고 코드로 옮겨보니까 너무 재미있다!😁

아직 알고리즘적으로 생각하는게 많이 부족하니까 천천히 한단계 나아가보자!   

728x90
728x90

[문제 설명]

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해 주세요.

 

[입출력 예]

phone_book return
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

 

[차근 차근 생각해보기]

  1. set에 전화번호를 넣어준다.
  2. phone_book 배열을 돌면서 phone_book 원소를 0부터 i번째까지 잘라준다.
  3. 자른 것이 set에 포함 되어 있으면 false를 리턴해준다.    

 

[코드]

<수정전>

import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);

        for (int i = 0; i < phone_book.length - 1; i++) {
            String s = phone_book[i];
            if (phone_book[i + 1].startsWith(s)) {
                return false;
            }
        }
        return answer;
    }
}

 

<수정후>

import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        HashSet<String> set = new HashSet();
        for (String phone : phone_book) {
            set.add(phone);
        }
        
        for (String phone : phone_book) {
            for (int i = 0; i < phone.length(); i++) {
                String prefix = phone.substring(0, i);
                
                if (set.contains(prefix)) {
                    return false;
                }
            }
        }
        
        return true;

    }
}

 

[반성할 점]

처음엔 이중 반복문으로 풀려고 했는데 계속 답이 안 맞고, 시간초과가 났다.😭

다음엔 phone_book 배열을 정렬한 뒤 i+1번째 원소가 i번째 원소로 시작하면 false를 리턴해주는 방법으로 풀었었다. 

 

그리고 나는 항상 풀고 나선 개발자 지인에게 항상 코드 수정할 것은 없는지,

효율적인 방법은 없는지, 풀면서 모르는 것들을 물어보는 습관이 있다. 

 

나름 뿌듯하게 풀었다며 코드를 보여주었고, 풀면서 시간초과가 나는 이유에 대해서도 물어보았다.

정렬해서 푸는 방법보다는set을 사용하여 푸는 것이 효율적이라고 이야기해 주었다.

이유는 제한사항에 phone_book 배열의 길이는 1이상 1,000,000이하 이고 이럴 경우 이중 반복문을 돌게 되면 시간 초과가 난다고 하였다.

이를 해결하기 위해선 hash를 사용해야 한다고 했다. 

 

hash는 하나하나 돌면서 그 값을 찾는 게 아닌 일치하는 값이 있으면 바로 이동한다고 하였다.

(잘못된 정보면 지적부탁드립니다. 지적은 언제든지 환영입니다!) 

 

그다음 phone_book 배열 원소 하나를 0번째에서 i번째까지 substring으로 잘라 set에 포함되어 있는지 비교하면 된다고 하였다.

 

아직까지 이렇게 논리적으로 생각하는 게 많이 부족하다ㅠ

그리고 이제는 자료구조를 공부해야 할 때인 것 같다..  

 

 

728x90
728x90

[문제 설명]

운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

 

[입출력 예]

priorities location return
[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 6

 

[차근 차근 생각해보기]

  1. 우선순위랑 기존의 인덱스를 가지고 있기 위해 Item 객체를 만들어준다.
  2. queue에 Item 객체를 넣어준다.
  3. 맨 앞에 있는 queue를 꺼내서 더 높은 우선순위가 있으면 다시 queue에 넣어주고
  4. 우선순위가 더 높은 것이 없다면 프로세스가 실행 되었기 때문에 cnt를 올려주면서
  5. 현재 인덱스가 location과 같다면 answer를 return 해준다.

 

[코드]

import java.util.*;
class Solution {
    public int solution(int[] priorities, int location) {
        Queue<Item> queue = new LinkedList<>();

        for (int i = 0; i < priorities.length; i++) {
            Item item = new Item(priorities[i], i);
            queue.add(item);
        }


        int cnt = 0;
        int answer = 0;
        while (!queue.isEmpty()) {
            boolean flag = false;
            Item current = queue.poll();
            for (Item val : queue) {
                if (current.priority < val.priority) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                queue.offer(current);
            }else{
                cnt++;
                if (current.index == location) {
                    answer = cnt;
                    break;
                }
            }
        }
        return answer;
    }
    
    static class Item {
        int priority;
        int index;

        public Item(int priority, int index) {
            this.priority = priority;
            this.index = index;
        }
    }
}

 

[반성할 점]

이 문제는 정말 어려웠당..!😭

사실 문제에 나와 있는대로 하나하나 풀면 되는데 코드로 구현하는 것이 너무 어려웠다..

 

객체를 이용하여 queue에 넣는 아이디어와 flag를 이용하여 우선순위 비교를 하는 아이디어는

정말 상상도 못할 아이디어였다.

 

이 문제는 이해하기도 이해하지만 푸는 방법을 통째로 외워놨다가

나중에 비슷한 유형의 문제가 있을때 응용해서 풀어보아야겠다..!

728x90
728x90

[문제 설명]

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

[입출력 예]

answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

[차근 차근 생각해보기]

  1. 각 수포자들이 찍은 방식을 배열로 만든다.
  2. answers 배열의 길이까지 돌면서
  3. i번째 원소가 각각의 수포자가 찍은 답과 같다면 카운트 1을 해준다.
  4. 카운트 한 변수를 score 변수에 담아주고 가장 큰 값을 비교해준다. 
  5. score 배열을 돌면서 i번째 원소가 max의 값과 같으면 리스트에 해당 수포자를 추가해준다. 

 

[코드]

import java.util.*;
class Solution {
    public int[] solution(int[] answers) {
        int[] one = {1, 2, 3, 4, 5};
        int[] two = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] three = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};

        int cnt1 = 0;
        int cnt2 = 0;
        int cnt3 = 0;
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == one[i % 5]) {
                cnt1 += 1;
            }

            if (answers[i] == two[i % 8]) {
                cnt2 += 1;
            }

            if (answers[i] == three[i % 10]) {
                cnt3 += 1;
            }
        }

        int[] score = {cnt1, cnt2, cnt3};

        List<Integer> result = new ArrayList<>();
        int max = Math.max(score[0], Math.max(score[1], score[2]));

        for (int i = 0; i < score.length; i++) {
            if (max == score[i]) {
                result.add(i + 1);
            }
        }

        int[] answer = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            answer[i] = result.get(i);
        }
        return answer;
    }
}

 

[반성할 점]

먼저 값을 비교하는 방법부터 막혔다.

하나 하나 비교하기 위해선 while문을 돌아야하나? 하면서 고민하며 찾던 중 

'배열명[i번째 % 배열의 길이]'를 하면 해당 자리수가 나오는 것을 알게 되었다.

자리수를 찾는 방법은 전혀 생각도 못하고 있었던 것이다.😭(하나하나 비교해야하나? while문 돌아야하나? 했는데..)

 

다음은 가장 큰 값을 구한 후, 해당 값을 가지고 있는 수포자를 넣어주어야 하는데 요것도 잘 생각해내지 못했다..

당연히 가장 많이 맞힌 사람을 넣어주어야 하는데 이 조건을 제대로 파악하지 못했었다.

 

문제를 읽을 때, 조건을 파악하고 이를 코드로 작성하는 것이 아직 많이 부족한 것 같다.

이번에 자리수를 구하는 법을 알았고, 조건 파악을 하여 어떻게 코드로 만들지 알았으니

잘 기억 해두었다가 다시 문제를 풀어봐야겠다.       

 

728x90
728x90

[문제 설명]

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

 

[입출력 예]

chicken result
100 11
1,081 120

 

[차근 차근 생각해보기]

  1. 쿠폰 10장 당 치킨 1마리가 서비스로 주어지므로 -> 서비스는 쿠폰 / 10   
  2. 서비스로 사용한 쿠폰의 나머지와 서비스로 받은 치킨을 합해서 다시 계산해야함. 
  3. 이때 처음 쿠폰을 사용할땐 그동안 시켜먹은 치킨이 쿠폰의 개수가 됨. 

 

[코드]

class Solution {
    public int solution(int chicken) {
        int coupon = chicken; // 처음 사용할 쿠폰의 개수
        int answer = 0;

        while (coupon >= 10) { // 쿠폰이 10장 이상이어야 서비스를 받을 수 있음
            int service = coupon / 10;
            answer += service;
            coupon = (coupon % 10) + service;
        }
        return answer;
    }
}

 

[반성할 점]

조건을 차근 차근 생각해보며 문제를 풀어야 하는데

머리속에서 먼가 꼬여서 조건을 잘 파악하지 못했던 문제이다.

시간이 오래 걸리더라도 차근차근 생각해보고 급하게 마음 먹지 않기!    

728x90
728x90

[문제 설명]

문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. "l"이나 "r"이 없다면 빈 리스트를 return합니다.

 

[입출력 예]

str_list result
["u", "u", "l", "r"] ["u", "u"]
["l"] []

 

[차근 차근 생각해보기]

  1. l과 r 둘다 있는 경우
    • l이 먼저 나오면 왼쪽 문자열을 순서대로 (l < r)
    • r이 먼저 나오면 오른쪽 문자열을 순서대로 (r < l)   
  2. l은 있지만 r이 없는 경우
  3. r은 있지만 l이 없는 경우
  4. l과 r 둘다 없으면 빈 리스트

 

[코드]

import java.util.*;
class Solution {
    public String[] solution(String[] str_list) {
        String[] answer = {};

        List<String> str = new ArrayList<>(Arrays.asList(str_list));
        List<String> list = new ArrayList<>();

        if(str.contains("l") && str.contains("r")){
            int l = str.indexOf("l");
            int r = str.indexOf("r");

            if(l < r){
                for (int i = 0; i < l; i++) {
                    list.add(str.get(i));
                }
            }else{
                for (int i = r + 1; i < str.size(); i++) {
                    list.add(str.get(i));
                }
            }
        }else if(str.contains("l") && !str.contains("r")){
            int l = str.indexOf("l");
            for (int i = 0; i < l; i++) {
                list.add(str.get(i));
            }
        }else if(!str.contains("l") && str.contains("r")){
            int r = str.indexOf("r");
            for (int i = r + 1; i < str.size(); i++) {
                list.add(str.get(i));
            }
        }else{
            list.add("");
        }

        answer = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i) == ""){
                answer = new String[]{};
                break;
            }
            answer[i] = list.get(i);
        }
        return answer;
    }
}

 

[반성할 점]

진짜 너무 어려웠다..😭 그냥 문제만 보고 생각나는 대로 풀었는데 뭔가 조건이 계속 꼬인거 같고,

코드도 더러워져서 지우고 다시 천천히 조건을 나열해 보았다.

처음엔 l과 r의 인덱스를 둘다 구해 놓고 인덱스로 조건을 만들었는데 그러기 보다는 문자열 포함여부로

조건을 걸고 계산을 하는 것이 더 쉽고 깔끔했다..ㅠ

한시간 동안 헤메고 헤메다가 겨우 풀었던 문제..!

그래도 생각하는 방식이 늘고 있는 것 같아 행복하다!!

아자 아자 화이팅!  

728x90
728x90

[문제 설명]

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

 

[입출력 예]

strArr result
["and","notad","abcd"] ["and","abcd"]
["there","are","no","a","ds"] ["there","are","no","a","ds"]

 

[차근 차근 생각해보기]

  1. 이름이 list인 리스트를 하나 선언해준다.
  2. strArr의 길이만큼 돌면서 만약 strArr[i] 번째에 'ad'라는 글자가 포함되지 않으면
  3. 처음에 선언 했던 list에 strArr[i]번째 요소를 추가해준다.
  4. [리스트명].toArray() 메서드로 list 리스트를 배열로 변환하여 return해준다.       

 

[코드]

<수정 전>

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
    public String[] solution(String[] strArr) {
        List<String> list = new ArrayList<>(Arrays.asList(strArr));

        for (int i = 0; i < strArr.length; i++) {
            if(!strArr[i].contains("ad")){
                list.remove(strArr[i]);
            }
        }

        String[] answer = list.toArray(new String[list.size()]);
        return answer;
    }
}

 

<수정 후>

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
    public String[] solution(String[] strArr) {
        List<String> list = new ArrayList<>();

        for (int i = 0; i < strArr.length; i++) {
            if(!strArr[i].contains("ad")){
                list.add(strArr[i]);
            }
        }

        String[] answer = list.toArray(new String[list.size()]);
        return answer;
    }
}

 

[반성할 점]

처음에 strArr의 배열은 list로 만들어 ad가 포함 된다면 빼주는 방법을 택했다. 하지만 계속 정답이 아니라고 하였고 며칠을 고민하다가 조언을 구하였다.

 

list의 길이가 5인 리스트에서 ad가 포함된 요소를 remove 하게 되면 list의 길이는 4가 되고 계속 줄어든 리스트의 길이까지 돌게 되기 때문에 문제가 생긴다고 하였다.

 

이야기를 듣고 고민해보았는데 그냥 삭제하기 보다는 list에 ad가 포함 되지 않는 것을 추가해주는 것이 더 간편하다고 생각했고 add 메서드를 사용해본 결과 문제가 잘 풀렸다..!

 

이제는 하나하나 동작을 어떻게 하는지 원리를 찾아보는 것도 필요하다..

아직 부족한 점이 많지만 차근차근 한걸음 나아가보아야겠다..!  

728x90

+ Recent posts