728x90

'냉장고 문을 연다. 코끼리를 넣는다. 냉장고 문을 닫는다.' 

요즘 천국의 계단을 타면서 유산소 운동을 한다. 운동을 하면서 드라마를 보는데 드라마에서 코끼리를 냉장고에 넣는 방법에 대해 이야기를 하였다. 냉장고 문을 열고 코끼리를 넣고 냉장고 문을 닫으면 된다고 하였다.

처음에 듣고 음? 어떻게 해야하지 싶었는데 생각보다 단순한 대답이 나와서 좀 당황했다..

 

생각해보니 복잡하게 생각할 것 없이 문을 열고 코끼리를 넣고 문을 닫으면 끝이다. 그러다 냉장고와 코끼리의 크기가 비슷하다면 잘 들어갈 것이고, 코끼리가 냉장고에 비해 너무 크면 냉장고는 터질 것이다.

 

너무 단순해서 운동을 하면서 한동안 멍하니 있었다.

 

단순하게 생각하자 단순하게

요즘 주변에서 취업 소식이 들려오면서 많은 생각들이 스쳐 지나갔다.

내가 무엇이 부족한지, 내 이력서가 너무 별로여서 연락이 오지 않는건지, 많은 생각들로 하루를 보내고 있다.

 

그러다 문득 저 대사를 듣고 '아 내가 요즘 너무 복잡하게 생각하고 있구나' 라는 생각이 들었다.

내 전 회사는 나와 맞지 않았기 때문에 냉장고가 터져버린 것이고, 지나간 일은 생각할 이유도 없는데 과거에 얽매여 있었다. 그냥 터져버린 냉장고는 더이상 쓸 수 없으니 버리자.

 

그리고 개발자라는 꿈을 향해 포기하지 않고 다시 일어나 냉장고 문을 열어, 코끼리를 냉장고에 넣으려고 노력하다 보면 언젠간 들어가 냉장고의 문도 잘 닫힐 것이다.

 

취업이 되지 않는다고 너무 복잡하게 생각하지 말자 지금 나는 터진 냉장고는 버렸고, 다시 코끼리를 냉장고에 넣기 위해 문고리를 잡은 상태이다. 지금은 코끼리를 넣는데에만 집중하자..! 

 

무슨 말을 쓴건지 모르겠지만..

그냥 주절주절 써보고 싶었당..  

 

728x90

'주절주절' 카테고리의 다른 글

[회고] 우당탕탕 2023  (3) 2023.12.31
멘토링 진작 할걸..!!  (0) 2023.12.19
체대생에서 개발자로  (1) 2023.06.07
728x90

멘토링을 듣고 나서

 수습 종료 통보를 받은지 6개월이 지났다. 그리고 아직도 취업을 못했다..

혼자 준비하는 것보단 나와 다른 의견을 갖고 있진 않는지 다른 의견도 들어보는게 나을 것 같아 인프런에서 진행하는 멘토링을 신청했다. 결과적으론 왜 진작 신청해보지 않았을까 후회되었고, 내가 생각하는 것에 대해 다시 한번 되돌아 볼 수 있는 시간이었다.

 멘토님과 나눈 이야기를 올리는 것은 도리에 맞지 않는 것 같아 올리진 않겠다. 다만 내가 지금 하는 행동, 생각들이 이상한 길로 가는게 아니라는 것을 느꼈고, 지금 내가 나아가고 있는 방향으로 더 속도를 올려 나아가야겠다고 느꼈다.

 

개발자 너 좀 매력적이야..!

 나는 현재 오랜 취업준비로 자존감이 매우 떨어져있는 상태이다. 국비 동기들은 이제 1년차 개발자가 되어가고 있고 나는 경력 없는 신입이다..뭐가 이렇게 운이 없었는지, 내 실력이 많이 부족한지 아직도 취업 못한 것이 정말 힘들고 슬프다. 그럼에도 그만두고 싶다는 생각은 전혀 들지 않는다. 힘들다가도 문제를 풀고 있으면 정말 재밌고, 뭔가 내가 생각하는 것을 만들 수 있다는 것이 아직도 설레이고 흥미롭다.

 

 개발자라는 직업은 꾸준히 내 할일을 하며 실력을 쌓아가면 다른 직군에 비해 비교적 빠르게 빛을 볼 수 있다는 것이 참 매력적이라고 생각한다. (물론 어디까지나 내 생각이고, 이렇게 생각하지 않을 수도 있다.) 멘토님도 비슷한 이야기를해주셨다. 멘토링을 하고 나서 지금 당장은 내가 느릴지언정 꾸준히 포기만 하지 않는다면 나도 조만간 빛을 볼 수 있다는 생각이 강하게 들었다. 

 

다시 달콤한 꿀을 향해 달려보자

나는 꾸준함 하나로 평생 못할 것 같았던 20kg 감량에 성공했다. 이 성공은 느껴본자만 알 것이다. 정말 달콤하고 말로 표현할 수 없는 행복감과 자신감이 생긴다. 그리고 이 기억으로 다른 일을 하는데 새로운 힘을 얻게 된다. 그동안 정말 절망적이고 힘든 생각에 갇혀 살았지만, 오늘 멘토링 이후로 내가 느껴봤던 성공을 향해 기나긴 여정을 떠나야겠다고 다짐하는 계기가 되었다. 

 

오랜만에 글을 써서 무슨 말을 하는지 글이 잘 이어지는지 잘 모르겠다..

그냥 오늘 멘토링을 하고나서 느꼈던 감정을 이렇게라도 남겨두고 싶어 작성하는 글이다.

 

728x90

'주절주절' 카테고리의 다른 글

[회고] 우당탕탕 2023  (3) 2023.12.31
코끼리를 냉장고에 넣는 방법  (2) 2023.12.29
체대생에서 개발자로  (1) 2023.06.07
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
728x90

[문제 설명]

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.

 

[입출력 예]

names result
["nami", "ahri", "jayce", "garen", "ivern", "vex", "jinx"] ["nami", "vex"]

 

[차근 차근 생각해보기]

  1. 배열 names의 길이까지 돌면서 5번째 마다 값을 보여주어야 하기 때문에 i에 5씩 증가시켜준다.
  2. answer 배열에 담아주기 위해 answer 배열의 길이를 names의 길이 나누기 5를 한 뒤 올림을 해준다.
  3. answer 배열에 순서대로 담아주기 위해 index 변수를 선언하여 1씩 증가하도록 한다.
  4. answer를 return 해준다.         

 

[코드]

<수정 전>

class Solution {
    public String[] solution(String[] names) {
        String[] answer = new String[(names.length / 5) + 1];
        int index = 0;
        
        for(int i = 0; i < names.length; i+=5){
            answer[index++] = names[i];
        }
        
        return answer;
    }
}

 

<수정 후>

class Solution {
    public String[] solution(String[] names) {
        String[] answer = new String[(int) Math.ceil((double)names.length / 5)];
        int index = 0;
        
        for(int i = 0; i < names.length; i+=5){
            answer[index++] = names[i];
        }
        
        return answer;
    }
}

 

[반성할 점]

처음에 코드를 돌려보니 test 케이스는 통과하여 답안 제출을 하였다. 하지만 틀린 답이라고 하여 며칠을 고민 했다.

고민해도 답이 나오지 않아 도움을 구해보니 내가 answer배열의 길이를 잘못 구했었다.

 

만약 names 배열의 길이가 5라면 answer의 길이는 1이 될 것이다.

하지만 내가 작성한 '(names.length / 5) + 1' 을 하게 되면 answer 배열의 길이가 2로 선언 될 것이다.

그래서 names의 길이에서 5로 나눈 몫을 한 뒤에 올림을 해주면 names의 길이가 5일 경우 answer에도 1개의 원소가 담길 것이고, 5초과 일 경우 올림이 되어 answer 배열의 길이가 선언될 것이다.

 

아직 테스트 케이스는 통과하는데 답이 아닐 경우 왜 답이 아닌지 찾기가 너무 힘들다..😭

이번 문제의 문제점을 꼭 기억해서 비슷한 경우가 있을 때, 해결해보아야겠다..

 

아..! 그리고 Math.ceil의 메소드엔 double 타입이기 때문에 꼭 괄호 안엔 double 타입으로 들어가야한다..

요거 때문에 다 풀고도 오류나서 한참 헤멨다..😓    

728x90

+ Recent posts