본문 바로가기
일지/취준일기

2024_12_11 취준일기 15일차

by 알케니브 2024. 12. 11.

오늘의 계획

 

2. 프로그래머스 코딩 테스트

문제1.

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

제한사항: 

  • 1 ≤ arr의 길이 ≤ 1,000
    • 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    • 0 ≤ s ≤ e < arr의 길이
    • 0 ≤ k ≤ 5

입출력 예

arr queries result
[0, 1, 2, 4, 3] [[0, 4, 1,], [0, 3, 20], [0, 3, 3]] [3, 2, 4, 6, 4]
  • 입출력 예 #1: 각 쿼리에 따라 arr가 다음과 같이 변합니다.
arr
[0, 1, 2 ,4 ,3]
[1, 2 ,3 ,5, 4]
[2, 2, 4, 5, 4]
[3, 2, 4, 6, 4]
  • 따라서 [3, 2, 4, 6, 4]를 return 합니다
class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = {};
        return answer;
    }
}

 

풀이과정

:

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        
        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];
        }
        return answer;
    }
}

일단 이전거 참고하여 여기까지 완성함. 여기다 안에 또 for문이랑 if문을 거나 했음

 

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        
        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];
            
            for (int j = s; j <= e; j++) {
                if (i % k == 0) {
                    answer[i] += 1;
                }
            }
        }
        return answer;
    }
}

엥 근데 틀렸다고 나옴... 는 아래 for문에 j라고 적어야할걸 i로 적어놨다ㅋㅋㅋ

 

정답

import java.util.Arrays;
class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        
        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];
            
            for (int j = s; j <= e; j++) {
                if (j % k == 0) {
                    arr[j] += 1;
                }
            }
        }
        answer = Arrays.copyOf(arr, arr.length);
        
        return answer;
    }
}

 

++ 다른사람의 풀이


 

문제2.

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

제한사항: 1 ≤ l ≤ r ≤ 1,000,000

입출력 예

l r result
5 555 [5, 50, 55, 500, 505, 550, 555]
10 20 [-1]
  • 입출력 예 #1: 5 이상 555 이하의 0과 5로만 이루어진 정수는 작은 수부터 5, 50, 55, 500, 505, 550, 555가 있습니다. 따라서 [5, 50, 55, 500, 505, 550, 555]를 return 합니다.
  • 입출력 예 #2: 10 이상 20 이하이면서 0과 5로만 이루어진 정수는 없습니다. 따라서 [-1]을 return 합니다.
class Solution {
    public int[] solution(int l, int r) {
        int[] answer = {};
        return answer;
    }
}

 

풀이과정

얘도 감이 안와서...한참 하다가 결국 구글링함

https://flen-e.github.io/%EC%9E%90%EB%B0%94%EA%B3%B5%EB%B6%80-%EB%B0%B0%EC%97%B4%EB%A7%8C%EB%93%A4%EA%B8%B02/

 

정답

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List solution(int l, int r) {
        List<Integer> answer = new ArrayList<>();
        
        for (int i = l; i <= r; i++) {
            String result = Integer.toString(i);
            
            int count = 0;
            
            for (int j = 0; j < result.length(); j++) {
                if(result.charAt(j) == '5' || result.charAt(j) == '0')
                    count++;
                if(count == result.length())
                    answer.add(Integer.parseInt(result));    
            }
            
        }
        if (answer.size() == 0)
            answer.add(-1);
        
        return answer;
    }
}

 

++ 다른사람의 풀이

import java.util.ArrayList;

class Solution {
    public int[] solution(int l, int r) {

        ArrayList<Integer> list = new ArrayList<>();

        for (int i = 1; i < 64; i++) {
            int num = Integer.parseInt(Integer.toBinaryString(i)) * 5;
            if (l <= num && num <= r)
                list.add(num);
        }

        return list.isEmpty() ? new int[] { -1 } : list.stream().mapToInt(i -> i).toArray();
    }
}

댓글에 2진법을 이용한 풀이법이라고 하면서 많은 추천을 받은 풀이법이 있었다... 2진법은 생각도 못함


문제3.

정수 start_num와 end_num가 주어질 때, start_num부터 end_num까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

제한사항: 0 ≤ start_num ≤ end_num ≤ 50

입출력 예

start_num end_num result
3 10 [3, 4, 5, 6, 7, 8, 9, 10]
  • 입출력 예 #1: 3부터 10까지의 숫자들을 담은 리스트 [3, 4, 5, 6, 7, 8, 9, 10]를 return합니다.
class Solution {
    public int[] solution(int start_num, int end_num) {
        int[] answer = {};
        return answer;
    }
}

 

풀이과정

class Solution {
    public int[] solution(int start_num, int end_num) {

        
        for(int i = 0; i < cnt; i++) {
            answer[i] = start_num++;
        }
        
        return answer;
    }
}

일단 for 문부터 써놓고 위에 작성을 추가했다

 

정답

class Solution {
    public int[] solution(int start_num, int end_num) {
        int cnt = end_num - start_num + 1; 
        int[] answer = new int[cnt];
        
        for(int i = 0; i < cnt; i++) {
            answer[i] = start_num++;
        }
        
        return answer;
    }
}

 

++ 다른사람의 풀이


문제4.

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.

그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.

계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.

임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.

제한사항: 1 ≤ n ≤ 1,000

입출력 예

n result
10 [10, 5, 16, 8, 4, 2, 1]
  • 입출력 예 #1: 순서대로 연산한 결과를 표로 만들면 다음과 같습니다.
연산 횟수 x 홀짝 여부
0 10  짝수
1 5 홀수
2 16 짝수
3 8 짝수
4 4 짝수
5 2 짝수
6 1 홀수

따라서 [10, 5, 16, 8, 4, 2, 1]을 return 합니다.

class Solution {
    public int[] solution(int n) {
        int[] answer = {};
        return answer;
    }
}

 

풀이과정

다른 사람들의 풀이를 보니 while문을 이용하더라. 거기에 if문으로 나누기 2나 3곱하고 더하기 1을 하는 문장을 만들면 될것같았다

 

정답

import java.util.ArrayList;

class Solution {
    public int[] solution(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(n);
        
        while (n != 1) {
            if (n % 2 == 0) {
                n = n / 2;
                list.add(n);
            } else {
                n = 3 * n +1;
                list.add(n);
            }
        }
        
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] =list.get(i);
        }
        
        return answer;
    }
}

 

++ 다른사람의 풀이


문제5.

제한사항: 

입출력 예

  • 입출력 예 #1
  • 입출력 예 #2

 



풀이과정

:

 

 

 



정답

 

 

++ 다른사람의 풀이

 


3. 이력서/지원/면접 준비 활동

'일지 > 취준일기' 카테고리의 다른 글

2024_12_16 취준일기 17일차  (0) 2024.12.16
2024_12_12 취준일기 16일차  (0) 2024.12.12
2024_12_09 취준일기 14일차  (3) 2024.12.09
2024_12_05 취준일기 13일차  (0) 2024.12.05
2024_12_04 취준일기 12일차  (0) 2024.12.05