🎲 제일 작은 수 제거하기

💡 문제 설명

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

💡 제한 조건

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



💡 기본 코드

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

💡 정답 코드

class Solution {
  public int[] solution(int[] arr) {
      int[] answer = {};
	  if(arr.length==1) return new int[]{-1};
	      
	  int loc = 0;
	  for(int i = 0; i < arr.length ; i++){
      	if(arr[i]<arr[loc])
	    loc = i;
      }
	  		
	      
	  int index = 0;
	  answer = new int[arr.length - 1];
      
	  for(int i = 0; i < arr.length ; i++) {
	  	if(i==loc) continue;
	    answer[index++] = arr[i];
	  }
	      
	  return answer;
  }
}

💡 문제 풀이

문제 푸는 과정

  1. arr의 길이가 1이면 -1을 담은 배열을 return 한다.
  2. 1이 아니면 arr 배열 중 가장 작은 값이 담긴 위치를 찾는다.
  3. 새로운 배열에 가장 작은 수의 위치가 겹치지 않으면 arr의 값을 넣는다.

arr의 길이가 1인 배열이면 가장 작은 수를 제거했을 때 배열의 길이 0이 된다. 따라서 -1을 바로 return 해준다.

가장 작은 값이 있는 배열의 위치를 찾기 위해 loc을 선언한다. arr의 값이 loc 방의 값보다 작으면 locarr의 현재 위치로 바꿔준다.

새로운 배열 answer은 작은 수를 제거한 배열이기 때문에 arr보다 1이 작은 길이로 선언해준다. indexanswer 배열의 방번호를 나타내는 변수이다. arri를 통해 방번호를 찾아준다. 이때 iloc이 같다면 해당 값은 가장 작은 값이기 때문에 continue를 사용해 해당 값은 넣지 않고 넘긴다.


문제 링크 🔗 : 제일 작은 수 제거하기



🎲 없는 숫자 더하기

💡 문제 설명

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

💡 제한 조건

  • 1 ≤ numbers의 길이 ≤ 9
    - 0 ≤ numbers의 모든 원소 ≤ 9
    - numbers의 모든 원소는 서로 다릅니다.



💡 기본 코드

class Solution {
    public int solution(int[] numbers) {
        int answer = -1;
        return answer;
    }
}

💡 정답 코드

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        int answer = 0;
        
        for(int i=0; i<10; i++)
            answer+=i;
        
        for(int i=0; i<numbers.length; i++)
            answer-=numbers[i];
        return answer;
    }
}

💡 문제 풀이

문제 푸는 과정

  1. 0~9까지의 합을 구한다.
  2. 합에서 numbers에 들어있는 값을 뺀다.

0~9까지 숫자 중 없는 수의 합을 구하기 때문에 반대로 생각해보면 없는 수의 합은 0~9까지의 합 중에서 있는 수를 빼면 된다.


문제 링크 🔗 : 없는 숫자 더하기



🎲 약수의 개수와 덧셈

💡 문제 설명

두 정수 leftright가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

💡 제한 조건

  • 1 ≤ leftright ≤ 1,000


💡 기본 코드

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        return answer;
    }
}

💡 정답 코드

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        
        for(int i=left; i<=right; i++){
            int count = 0;
            for(int j=1; j<=i; j++){
                if(i%j == 0) count++;
            }
            if(count%2==0) answer+=i;
            else answer-=i;
        }
        
        return answer;
    }
}

💡 문제 풀이

문제 푸는 과정

  1. 반복문을 left에서 right까지 돌린다.
  2. 만약 left에서 right 사이에 있는 수에 약수가 있다면 count를 증가한다.
  3. count가 짝수라면 수를 더하고 아니면 뺀다.

leftright의 사이에 수는 i이고, ji의 약수를 구하기 위해 필요한 수이다. 만약 ij로 나눠진다면 j가 약수이기 때문에 count를 증가시킨다. i의 약수를 모두 구하고 나면 count의 홀짝여부를 판단하여 계산한다.


문제 링크 🔗 : 약수의 개수와 덧셈



🎲 서울에서 김서방 찾기

💡 문제 설명

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다

💡 제한 조건

  • seoul은 길이 1 이상, 1000 이하인 배열입니다.
  • seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
  • "Kim"은 반드시 seoul 안에 포함되어 있습니다.


💡 기본 코드

class Solution {
    public String solution(String[] seoul) {
        String answer = "";
        return answer;
    }
}

💡 정답 코드

import java.util.*;
class Solution {
    public String solution(String[] seoul) {

        return "김서방은 "+Arrays.asList(seoul).indexOf("Kim")+"에 있다";
    }
}

💡 문제 풀이

문제 푸는 과정

  1. seoul을 배열에서 list 형태로 바꾼다.
  2. list에서 "kim"의 위치를 찾는다.

Array인 seoul을 list로 바꾸기 위해 Arrays.asList()를 사용한다. 그 이유는 list의 요소값의 위치를 반환해주는 indexOf()를 사용하기 위해서이다.

  • Arrays.asList(Array) : 배열을 리스트로 바꿔주는 메서드이다.
  • List.indexOf(value) : 리스트에서 value의 위치를 찾아주는 메서드이다.

문제 링크 🔗 : 서울에서 김서방 찾기



🎲 전화번호 목록

💡 문제 설명

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

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

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

💡 제한 조건

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    - 각 전화번호의 길이는 1 이상 20 이하입니다.
    - 같은 전화번호가 중복해서 들어있지 않습니다.


💡 기본 코드

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        return answer;
    }
}

💡 정답 코드

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
		Arrays.sort(phone_book);

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

        return true;
    }
}

💡 문제 풀이

문제 푸는 과정

  1. phone_book을 정렬한다.
  2. phone_book을 비교하며 만약 phone_book의 값이 그전 값으로 시작한다면 false를 return 한다.

phone_book을 정렬하는 이유는 문자열 배열은 문자열의 길이로 정렬하기 때문이다. 따라서 길이가 작은 값이 앞쪽으로 정렬된다. 길이가 작을수록 앞에 있기 때문에 그 뒤의 값에 접두어일 확률이 올라간다. 접두어는 길이가 더 짧아야 하기 때문이다.

phone_book의 값이 접두어인지 확인하기 위해서 startsWith()을 사용했다. 이때 접두어인지 확인해야하기 때문에 인수로 더 작은 값을 넘겼다. 함수의 반환값이 true일 경우 접두어이기 때문에 false를 return 한다.

  • String.startsWith(String) : 어떤 문자열이 특정 문자로 시작하는지 알 수 있는 메서드이다.

문제 링크 🔗 : 전화번호 목록



profile
헐 제가 회사를 다니면서 개발을 하고 있어요 이게 무슨 일이죠?

4개의 댓글

comment-user-thumbnail
2022년 4월 24일

전구 이모지를 붙여서인지 전 글 보다 보는 재미가 더 생긴 것 같아요!

답글 달기
comment-user-thumbnail
2022년 4월 24일

레이아웃이 더욱 깔끔해졌네요.
그리고 문제 풀이 방법이 상세해서 좋았습니다

답글 달기
comment-user-thumbnail
2022년 4월 24일

자바에도 startwith 함수가 있는지 몰랐네요

답글 달기
comment-user-thumbnail
2022년 4월 24일

문제 풀이가 깔끔하고 이해가 쏙쏙 되네요!

답글 달기