ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [올리브씨의 알고리즘 입문] Day 8 - 배열, 구현, 수학
    알고리즘/프로그래머스_입문 2024. 4. 16. 01:46

    029. 배열 자르기 (난이도 : ★)

    문제 설명.

      정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

     

    제한 사항.

    • 2 ≤ numbers의 길이 ≤ 30
    • 0 ≤ numbers의 원소 ≤ 1,000
    • 0 ≤num1 < num2 < numbers의 길이

     

    입출력 예.

    numbers num1 num2 result
    [1, 2, 3, 4, 5] 1 3 [2, 3, 4]
    [1, 3, 5] 1 2 [3, 5]

    풀이.

    class Solution {
        public int[] solution(int[] numbers, int num1, int num2) {
    
            int[] answer = new int[num2-num1+1];
            int j=0;
    
            for(int i=num1 ; i<=num2 ; i++){
                answer[j] = numbers[i];
                j++;
            }
            return answer;
        }
    }

     

    다른 풀이.

    import java.util.*;
    class Solution {
        public int[] solution(int[] numbers, int num1, int num2) {
            return Arrays.copyOfRange(numbers, num1, num2 + 1);
        }
    }
    import java.util.Arrays;
    class Solution {
        public int[] solution(int[] numbers, int num1, int num2) {
    
            int[] answer = Arrays.stream(numbers, num1, num2+1).toArray();
            return answer;
        }
    }
    import java.util.stream.IntStream;
    class Solution {
        public int[] solution(int[] numbers, int num1, int num2) {
            return IntStream.rangeClosed(num1, num2).map(i -> numbers[i]).toArray();
        }
    }

     

    MAIN POINTS.

    더보기

    [개발 포인트]

    • java.util.Arrays 패키지
      .copyOfRange(배열명, 처음 인덱스, 끝 인덱스);
      .stream(배열명, 처음 인덱스, 끝 인덱스).toArray();
    •  java.util.stream.IntStream 패키지

    030. 외계행성의 나이 (난이도 : ★)

    문제 설명.

      우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.

     

    제한 사항.

    • age는 자연수입니다.
    • age ≤ 1,000
    • PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.  

     

    입출력 예.

    age result
    23 "cd"
    51 "fb"
    100 "baa"

    풀이.

    class Solution {
        public String solution(int age) {
    
            String answer = "";
            String temp = String.valueOf(age);
            int[] ageArr = new int[temp.length()];
    
            for(int i=0; i<temp.length(); i++){
                if(temp.charAt(i)==0){
                    ageArr[i] = 97 ;
                }else{
                    ageArr[i] = temp.charAt(i)-'0'+97;
                }
                answer += (char)ageArr[i];
            }
            return answer;
        }
    }

     

    다른 풀이.

    //홍희표님 외 3인 코드
    import java.util.stream.Collectors;
    class Solution {
        public String solution(int age) {
            return String.valueOf(age).chars()
            	.mapToObj(operand -> String.valueOf((char) (49 + operand)))
                .collect(Collectors.joining());
        }
    }

     

    MAIN POINTS.

    더보기

    [개발 포인트]

    스트림을 사용할 줄 아는가?

     'a' - '0'가 49이기 때문에 49를 더함.

     


    031. 진료 순서 정하기 (난이도 : ★)

    문제 설명.

      외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

     

    제한 사항.

    • 중복된 원소는 없습니다.
    • 1 ≤ emergency의 길이 ≤ 10
    • 1 ≤ emergency의 원소 ≤ 100

     

    입출력 예.

    emergency result
    [3, 76, 24] [3, 1, 2]
    [1, 2, 3, 4, 5, 6, 7] [7, 6, 5, 4, 3, 2, 1]
    [1, 2, 3, 4, 5, 6, 7] [2, 4, 3, 5, 1]

    풀이.

    import java.util.HashMap;
    import java.util.Arrays;
    
    class Solution {
        public int[] solution(int[] emergency) {
            
            int length = emergency.length;
            int[] answer = new int[length];
            
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            int a = 0;
            
            //1. array 복제해서 sort 오름차순 정렬
            int[] copyArr = Arrays.copyOf(emergency, length);
            Arrays.sort(copyArr);
            
            //2. map 형식으로 진료순서 순차 나열 (key: emergency / value: 순위)
            for(int j=length; j>0; j--){
                map.put(copyArr[a], j);
                a++;
            }
    
            //3. emergency 를 key 값으로 map에서 순위를 빼와서 answer array에 저장한다.
            for(int i=0; i<emergency.length; i++){
                answer[i] = map.get(emergency[i]);
            }
            
            return answer;
        }
    }

     

    다른 풀이.

    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.stream.Collectors;
    
    class Solution {
        public int[] solution(int[] e) {
            return Arrays.stream(e).map(i -> Arrays.stream(e).boxed().sorted(Comparator.reverseOrder()).collect(Collectors.toList()).indexOf(i) + 1).toArray();
        }
    }

     

    MAIN POINTS.

    더보기

    [개발 포인트]

    - Array와 Map/HashMap을 사용할 줄 아는가?

     

    /* 배열 복사 2가지 방법 (*Arrays.copyOf 가 두 배가량 빠르다고 함.)
          1. System.arraycopy();
              : 새로운 배열을 생성가능, 전부 복사하거나 복사 대상의 객체를 유지시킬 필요가 없을 때 사용 추천.

                구문 : System.arraycopy(원본배열, 원본배열 복사시작 index, 복사배열, 복사배열 시작index, 복사할 요소 개수)
          2. Arrays.copyOf();
              : 복사의 길이를 명시, 객체를 유지하고자 할 때 사용 추천.

                구문 : Arrays.copyOf(원본배열, 원본으로부터 복사해 올 길이) */

            /* HashMap & Iterator 연습 */

            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            //[PUT] How to put in key&value at HashMap.
            map.put(21, 42);
            
            //[GET] How to get key&value from HashMap.
            Integer key = 21
            Integer value = map.get(key);
            System.out.println("Key: " + key +" value: "+ value); 
            //Key: 21 value: 42
            
            //If you want to iterate through data you need to define an iterator:
            Iterator<Integer> iterator = map.keySet().iterator();
            while(iterator.hasNext()){
              Integer key = iterator.next();
              System.out.println("key: " + key + " value: " + map.get(key));
            }


    032. 순서쌍의 개수 (난이도 : ★☆☆)

    문제 설명.

      순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.

     

    제한 사항.

    • 1 ≤ n ≤ 1,000,000

     

    입출력 예.

    n result
    20 6
    100 9

    풀이.

    class Solution {
        public int solution(int n) {
            int answer = 0;
            for(int i=1 ; i<=n; i++){
                if(n%i==0){
                    answer++;
                }
            }
            return answer;
        }
    }

     

    다른 풀이.

    import java.util.stream.IntStream;
    
    class Solution {
        public int solution(int n) {
            return (int) IntStream.rangeClosed(1, n).filter(i -> n % i == 0).count();
        }
    }

     

    MAIN POINTS.

    더보기

    [개발 포인트]

    약수를 찾는 방법.


    출처 :https://school.programmers.co.kr/ 입문 알고리즘

    https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc&languages=java

Designed by Tistory.