[20240117 TIL] JAVA 문제 풀이

Haizel·2024년 1월 17일
1
post-thumbnail

2024년 1월 5일부터 오늘 17일까지 약 2주간 Java에 대해서 공부하였다. 앞으로 1주일 정도 더 Java와 Spring에 대해 공부할 예정인데, 이 시점에서 지금까지 풀었던 Java 문제에 대해 정리해보면 좋을 것 같아 학습한 내용과 함께 정리해보도록 하자!

학습한 Java 내용은 다음과 같다.

① 자바의 객체지향 프로그래밍
② 참조 자료형 / 기본 자료형
③ 조건문 / 반복문
④ Array와 ArrayLists
⑤ Collection Frameworks
⑥ 제네릭

순서는 최근 순 → 오래된 순 (즉 어려운 순 → 쉬운 순)으로 역순으로 작성한다.
(그냥 내 맘이다.)

Q1. 홀수 필터링하기

⛔️ 엣지 케이스

  • 리스트에 양의 정수와 음의 정수가 모두 포함되어 있을 수 있습니다.
  • 리스트는 비어 있을 수 있습니다.

✨ 메서드

  • list.stream() : 리스트를 스트림으로 변환

  • stream.filter() : 요소를 필터링하여 제거

  • stream.collect(): 스트림을 다시 리스트로 변환한다.
    - 이때 해당 함수 안에서 임력된 요소들을 통해 새로운 리스트에 누적하도록 .collect() 함수에 명령하는 유틸리티 메서드인 Collectors.toList()를 사용한다.

✍️ 풀이

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class FunctionalProgrammingMagic {

    public static List<Integer> filterOddNumbers(List<Integer> numbers) {
     return numbers.stream().filter(x -> x % 2 != 0).collect(Collectors.toList());
    }
}

Q2. N개의 첫 숫자들의 세제곱 구하기

❓ 문제

정수 n을 입력값으로 받아서 첫 자연수 n개의 세제곱들이 담긴 리스트를 리턴합니다.

⛔️ 엣지 케이스

  • n이 언제나 0보다 크거나 같다고 가정합니다.
  • 또한 만일 n이 0이라면 여러분의 코드는 빈 리스트를 리턴해야 합니다.

✨ 메서드

  • IntStream.range() : n부터 m미만의 정수 수열을 생성

✍️ 풀이

import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.List;

public class FunctionalProgrammingMagic {

    public static List<Integer> getCubesOfFirstNNumbers(int n) {
       return  IntStream.range(1, n+1).map(num -> num * num *  num).boxed().collect(Collectors.toList());
    }
}

Q3. 강좌 이름의 길이 구하기

❓ 문제

강좌 이름 리스트를 받아서 각 강좌 이름의 문자 개수가 담긴 리스트를 리턴합니다.

⛔️ 엣지 케이스

  • 입력된 리스트는 null이 될 수 있습니다. 그런 경우에도 함수는 빈 리스트를 리턴해야 합니다.

✨ 메서드

  • mapToLong() : map() 메서드의 특수한 버전으로, LongStream(long 값들의 스트림)을 만들고 객체를 int로 변환하는 함수를 받는다

  • sum(): 스트림에 있는 숫자들의 합을 계산한다.

✍️ 풀이

import java.util.List;
import java.util.stream.Collectors;

public class FunctionalProgrammingMagic {

    public static List<Integer> getCourseNameCharacterCount(List<String> courses) {
        if (courses == null) {
            return List.of();
        }
        
        return courses.stream().map(x -> x.length()).collect(Collectors.toList());
    }
}

Q4. 가장 큰 짝수 구하기

❓ 문제

리스트의 가장 큰 짝수를 리턴하세요.

⛔️ 엣지 케이스

  1. 리스트는 null이 될 수 있습니다. 그런 경우에는 0을 리턴합니다.
  2. 리스트는 비어 있을 수 있습니다. 역시 0을 리턴합니다.
  3. 리스트에 홀수만 있을 수 있습니다. 그 경우에도 0을 리턴합니다.
  4. 리스트에 음수도 있을 수 있습니다. 그런 경우에는 최대 짝수를 구할 때 고려합니다.

✨ 메서드

  • stream(): Java Collection 인터페이스에 있는 함수로, 컬렉션에 있는 요소들로 이루어진 순차적인 스트림을 리턴한다. 스트림은 병렬로, 혹은 순차적으로 처리할 수 있는 요소들로 된 시퀀스를 의미한다.
  • filter(): Java Stream 인터페이스의 함수로, 불리언을 리턴하는 람다 함수를 받아 true를 리턴한 모든 요소들이 포함된 새로운 스트림을 리턴한다.
  • max(): Java Stream 인터페이스의 함수로, Comparator를 받고 제공된 Comparator에 따라 스트림의 최대 요소를 Optional로 감싸 리턴한다.
  • Optionalnull이 아닌 값을 포함하거나 포함하지 않을 수 있는 컨테이너 객체를 의미한다.
    - 만일 어떤 값이 존재하면 isPresent()는 true를 리턴하고, 그렇지 않다면 객체가 비어 있다고 간주해 false를 리턴한다.
    - Optional을 사용하면 NullPointerException을 피할 수 있다.
  • orElse(): Java Optional 클래스의 메서드로, 존재할 경우 값을 리턴하고 아니면 인수로서 전달된 기본 값을 리턴한다.
  • Integer::compare: Java에서 사용하는 메서드 참조이다.
    - 2개의 정수를 숫자로서 비교하는 Integer 클래스 안의 정적 메서드 compare를 참조한다.
    -  ::은 Java에서 메서드 또는 생성자를 참조하기 위해 사용하는 토큰이다.

✍️ 풀이

import java.util.List;
import java.util.Optional;

public class FunctionalProgrammingMagic {

    public static int findMaxEvenNumber(List<Integer> numbers) {
        if (numbers == null) {
            return 0;
        }
        
        Optional<Integer> maxEven =  numbers.stream().filter(x -> x % 2 == 0).max(Integer::compare);
        
        return maxEven.orElse(0);
       
    }
}

Q5. 애너그램 검사기

❓ 문제

 2개의 문자열 str1과 str2가 주어지면, 2개의 문자열이 서로 애너그램인지 판정해 결과를 리턴하세요.
🗣️ 애너그램이란 단어나 문구의 글자를 재배열하여 만들어진 단어나 문구를 가리킵니다.

⛔️ 엣지 케이스

  • 비교할 때 대소문자는 가리지 않습니다. 즉 “Listen”과 “Silent”는 애너그램으로 간주해야 합니다.
  • str1또는 str2가 null이라면 메서드는 false를 리턴해야 합니다.
  • str1과 str2의 길이가 같지 않아도 메서드는 false를 리턴해야 합니다.

✨ 메서드

  • string.toLowerCase(): 문자열에 있는 모든 문자를 소문자로 변환

  • string.toCharArray() : 문자열을 새로운 문자 배열로 변환

  • Arrays.sort(charArray): 지정된 배열을 숫자 오름차순으로 정렬

  • Arrays.equals(charArray1, charArray2): 지정된 두 문자 배열이 서로 같으면 true를 리턴

✍️ 풀이

import java.util.Arrays;

public class StringMagic {
    public boolean areAnagrams(String str1, String str2) {
    
        if(str1 == null || str2 == null) {
            return false;
        }
        
        if (str1.length() != str2.length()) {
            return false;
        }
        
        str1 = str1.toLowerCase();
        str2 = str2.toLowerCase();
        
        char[] charArr1 = str1.toCharArray();
        char[] charArr2  = str2.toCharArray();
        
        Arrays.sort(charArr1);
        Arrays.sort(charArr2);
        
        return Arrays.equals(charArr1, charArr2);
    }
}

Q6. 16진수 문자열인지 검사하기

❓ 문제

문자가 유효한 16진수 문자(A ~ F 또는 a ~ f)일 경우, isHexadecimalChar(char ch) 메서드는 true를 리턴하고, 그렇지 않으면 false를 리턴하세요.

⛔️ 엣지 케이스

  • 문자열이 비어 있거나 null인 경우, isHexadecimal()메서드는 false를리턴해야 합니다.
  • isHexadecimalChar(char ch) 메서드는 대소문자를 모두 처리해야 합니다.

✨ 메서드

  • Character.isDigit(char ch): 문자가 숫자인지 검사한다.

  • String.toCharArray() : 문자열을 문자 배열로 변환한다.

✍️ 풀이

public class MyString {

    public String str;

    public MyString(String str) {
        this.str = str;
    }
    
    public boolean isHexadecimalChar(char ch) {
        return (
            (ch >= 'a' && ch <= 'f') ||
            (ch >= 'A' && ch <= 'F')
            );
    }

    public boolean isHexadecimal() {
        if (str == null || str.length() == 0) {
            return false;
        }
        
        char[] arr = str.toCharArray();
        
        for(char ch: arr) {
            if (!isHexadecimalChar(ch) &&
            !Character.isDigit(ch)) {
                return false;
            }
        }
        return true;
    }

    
}

Q7. 역순 단어 제조기

❓ 문제

문자열 문장을 입력으로 받아서 문장 안의 모든 단어가 역순으로 변경되지만 원래의 단어 순서는 유지되는 문자열을 리턴해야 합니다.

⛔️ 엣지 케이스

  1. 입력된 문자열이 null이면 여러분의 메서드는 문자열 "INVALID"를 리턴해야 합니다.
  2. 입력된 문자열이 비어 있으면(즉, ""이면) 여러분의 메서드는 빈 문자열을 리턴해야 합니다.

✨ 메서드

  • string.split(String regex): 주어진 정규 표현식에 따라 문자열을 분할한다.

  • stringBuilder: 문자열 조작 작업을 할 때 String보다 더 효율적이다.

  • stringBuilder.reverse(): StringBuilder안의 문자 순서를 역순으로 바꾼다.

  • stringBuilder.append(String str): 지정된 문자열을 시퀀스에 추가한다.

  • string.trim(): 앞과 뒤의 공백을 생략한 문자열 사본을 리턴한다.

✍️ 풀이

public class StringMagic {

    public String reverseWordsInSentence(String sentence) {
        if(sentence == null) {
            return "INVALID";
        }
        
        if(sentence.isEmpty()) {
            return "";
        }
        
        String[] words = sentence.split(" ");
        StringBuilder reverseSentence = new StringBuilder();
        
        for(String word: words) {
            StringBuilder reverseWord = new StringBuilder(word).reverse();
            reverseSentence.append(reverseWord).append(" ");
        }
        
        return reverseSentence.toString().trim();
        
    }
}
profile
한입 크기로 베어먹는 개발지식 🍰

0개의 댓글

관련 채용 정보