알고리즘 주차 day1

최재하·2022년 11월 18일
0

오늘부터 알고리즘문제를 풀어보는 주차다.
일주일간 여러 난이도를 합쳐 40문제 푸는걸 목표로한다 . 오늘은 풀면서 어려웠거나 많이 헤맸던 문제를 올려보려합니다.


완주하지 못한 선수

📕 문제설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수이를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

📢 제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예


📖 풀이

import java.util.Arrays;
class Solution {
  public String solution(String[] participant, String[] completion) {
      String answer = "";
      Arrays.sort(participant);//배열을 정렬.
      Arrays.sort(completion);
      
      int i = 0;
      for(i = 0; i < completion.length; i++){
          if(participant[i].equals(completion[i])) {
              
          } else{
              break;
          }
              
      }
      answer = participant[i];
      
      
      return answer;
  }

완주하지 못한 자를 골라내는 문제다 completion 배열에는 없고 participant 배열에는 있는 사람을 찾으면 된다. Arrays.sort();로 배열을 정리해주고 for문으로 두 배열을 비교해주면 되는 문제였다.
completion배열이 길이가 1작으므로 completion의 길이만큼 for문을 돌리면서 participant[i]값과 completion[i]의값을 비교해주고 서로의 값이 틀리면 break;로 반복문을 빠져나오고 완주하지못한 선수 participant[i]을 반환한다.


자연수 뒤집어 배열로 만들기

📕 문제설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

📢 제한사항

  • n은 10,000,000,000이하인 자연수입니다.

입출력 예


📖 풀이

import java.util.Arrays;

class Solution {
  public int[] solution(long n) {
//    int num = (int) n;
//    String a = Integer.toString(num);
      String a = Long.toString(n);
      String[] str = a.split("");
      int[] answer = new int[str.length];
      int[] number = Arrays.stream(str).mapToInt(Integer::parseInt).toArray();

      for (int i = number.length - 1, j = 0; i >= 0; i--, j++) {
          answer[j] = number[i];
      }
         
      return answer;
  }
}

롱 타입으로 오는 변수를 문자열로 만들어 배열에 넣은뒤 다시 int형배열에 옮겨주고 배열을 뒤집어주는 식으로 문제를 풀었다. 처음에는 변수n을 문자열로 변환할 때 주석 처리한 부분처럼 해줬는데, 프로그래머스에서 코드실행할땐 잘 되다가 정답 제출을 하면 런타입에러가 나왔습니다. 문자열로 만들어줄때 Long.toString()으로 코드를 바꾸어주니 정상 작동하였습니다.




제일 작은 수 제거하기

📕 문제설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

📢 제한사항

arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

입출력 예

📖 풀이

import java.util.Arrays;
class Solution {
  public int[] solution(int[] arr) {
      int[] answer = new int[1];
      int min = Arrays.stream(arr).min().getAsInt();//가장작은수구하기
       if(arr.length == 1){//배열길이가1이면 -1넣어주기
          answer[0] = -1;
      } else{
          answer = new int[arr.length-1];
          for(int i = 0,j = 0; i < arr.length; i++){
              if(arr[i] != min){
                  answer[j] = arr[i];
                  j++;
              }
          }
      }
      
      return answer;
  }
}

우선 주어진 배열안에서 가장 작은 수를 구해야합니다.
가장 작은 수를 구하는 방법은 여러가지가 있는거같습니다 저는 stream을 사용해 가장 작은 수를 구했습니다. 배열의 길이가 1이면 가장 작은 수를 빼고 난 뒤 빈 배열이 되므로 -1을 넣어주고, 길이가 1보다 크면 구해놓은 min값과 비교해 중복되지 않는 수들을 새 배열에 넣어줬습니다.

0개의 댓글