본문 바로가기

항해 99/Java

Java 문법 기초 테스트-2

코딩테스트 Java 입문 단계 문제 풀이 코드

 

17. 문자열 뒤집기

문자열 my_string이 매개변수로 주어짐.  my_string을 거꾸로 뒤집은 문자열을 return

class Solution {
    public String solution(String my_string) {
        String answer = "";
        
        StringBuffer sb = new StringBuffer(my_string);
        answer = sb.reverse().toString();
        
        return answer;
    }
}

 

StringBuffer(스트링 버퍼)

  • 한 번 생성되면 그 값을 읽기만할 수 있고 변경할 수 없는 String 클래스의 인스턴스의 문제를 해결하기 위해 사용
  • StringBuffer 클래스의 인스턴스는 값을 수정하거나, 추가할 수 있음
  • 내부적으로 독립적인 공간(Buffer)를 가진다.
  • 버퍼의 크기는 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 크기를 설정할 수 있음(인스턴스 생성 시 사용자가 설정한 크기보다 16개의 문자를 저장할 수 있는 여유 공간을 가지고 생성됨)

사용 이유

  • 문자열을 결합할 수록 공간이 낭비되며 실행 속도도 매우 느려지기 때문, StringBuffer 인스턴스를 사용하면 문자열을 바로  추가할 수 있고, 공간의 낭비도 없는데다 속도도 매우 빠름.

StringBuffer method

  • apped() : 전달받은 값을 문자열로 반환하여 해당 문자열의 마지막에 추가한다. 이 메서드는 String 클래스의 concat() 메서드와 같은 결과를 반환하지만, 속도가 훨씬 빠르다
  • capacity() : StringBuffer 인스턴스의 현재 버퍼 크기를 반환
  • delete() , deleteCharAt() : delete() 메서드는 지정한 인덱스의 해당하는 부분 문자열을 제거한다. deleteCharAt() 메서드를 사용하여 해당 인덱스의 문자 한 개만 제거할 수 있음
  • insert() : 지정한 인덱스 위치에 입력 값을 문자열로 변환한 후 해당 인덱스 위치에 문자열을 추가한다. 인덱스의 값이 해당 문자열의 길이와 같으면 append() 메서드와 같은 결과를 반환한다.
  • reverse() : 문자열을 역순으로 나타내준다.

 

 

18. 특정 문자 제거하기

문자열 my_string 과 문자 letter가 매개변수로 주어짐. my_string에서 letter를 제거한 문자열을 return

class Solution {
    public String solution(String my_string, String letter) {
        String answer = "";
        answer = my_string.replaceAll(letter, "");
        return answer;
   } 
}

 

replace / replaceAll

  • 특정 문자열을 원하는 문자열로 치환하는 메소드
    • replaceAll : 첫 번째 인자로 정규식을 넣어서 replace로 처리하지 못하는 문자열로 처리가 가능하다. 

 

 

19. 문자 반복 출력하기

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n 만큼 반복한 문자열을 return

class Solution {
    public String solution(String my_string, int n) {
        String answer = "";
        for (int i = 0; i < my_string.length(); i++) {
            for (int j  = 0 ; j  < n; j++) {
                char chr = my_string.charAt(i);
                answer = answer + Character.toString(chr);
            }
        }    
        
        // toCharArray() 사용 시
        for (char ch : str.toCharArray()) {
            answer += (ch+"").repeat(n);
        }
    }
}

 

  • charAt() : 입력된 문자열 중 한 글자만 선택해서 char 타입으로 변환해 준다(String 타입의 참조변수 뒤에 붙여 사용하거나, Scanner의 next(), nextLine() 뒤에 붙여서 사용한다).
  • toCharArray() : String 문자열을 char형 배열로 바꿔서 변환해주는 메서드(toCharArray()로 변환한 배열 출력: for문, Array.toString() 사용)
  • repeat() : String 메서드 중 하나로 String 문자열을 파라미터의 주어진 횟수만큼 반복한다.
    • 파라미터를 0으로 지정하면 빈 문자열을 반환
    • 파라미터를 음수로 지정 시, 에러를 반환
    • 파라미터를 1로 지정 시 문자열을 그대로 반환

 

 

20. 편지

글자 한 자의 크기를 2cm로 해서 편지를 가로로만 적을 대, 문구 message를 적기 위해 필요한 편지지의 최소 가로 길이를 return

  • message는 영문 알파벳 대소문자, !, ~, 또는 공백으로만 구성됨.
class Solution {
    public int solution(String message) {
        int answer = 0;
        answer = message.length() * 2;
        return answer;
    }
}
  • message의 길이를 length로 구하고 글자 한 자의 크기 2를 곱하면 편지의 최소 가로 길이를 구할 수 있음

 

 

21. 모음제거

영어의 모음 :  a, e, i, o, u, 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return

class Solution {
    publicc String solution(String my_string) {
        String answer = my_string;
        String[] str = {"a", "e", "i", "o", "u"};
        for (String del : str) {
            answer = answer.replaceAll(del, "");
        }
        return answer;
        
        // 정규식 사용
        answer = my_string.replaceAll("[aeiou]", "")
    }
}
  • 영어 모음 (a, e, i, o, u)가 포함된 문자열 배열을 만든 뒤 for문을 통해 문자열을 순환하며 replaceAll을 통해 모음을 ""로 바꿔서 제거하거나 정규 표현식을 사용해 간단하게 모음을 제거할 수 있음

 

 

22. 문자열 안에 문자열

문자열 str1, str2가 매개변수로 주어질 때, str1 안에 str2가 있다면 1을 없다면 2를 return

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        
        if (str1.contains(str2)) {
            answer = 1;
        } else {
            answer = 2;
        }
        return answer;
    }
}
  • contains()를 사용해서 str1에 str2가 포함되어 있는지 간단하게 확인할 수 있으며, if 조건문을 통해 answer를 1 또는 2로 바꾼다.

 

 

23. 중복된 숫자 갯수

정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return

class Solution {
    public int solution(int[] array, int n) {
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == n) {
                count++;
            }
        }
        return count;
        
        // 향상된 for문 사용
        for (int num : array) {
            if (num == n) {
                count++;
            }
        }
    }
}
  • for문과 if문을 사용하여 array 내에 n이 있을 때 마다 count를 1개씩 늘리는 방식으로 array에 n이 몇 개가 있는지를 쉽게 구할 수 있음

 

 

24. 배열의 평균값

정수 배열 numbers가 매개변수로 주어질 때, numbers의 원소의 평균값을 return

import java.util.Arrays;

class Solution {
    public double solution(int[] numbers) {
        double average = 0, sum = 0;
        for (int num : numbers) {
            sum = sum + num;
        }
        average = sum / numbers.length;
        return average;
        
        // Stream 사용 간략화 
        average = Array.stream(numbers).average().orElse(0);
    }
}
  • for문을 통해서 numbers의 합계 sum을 구하고 sum을 numbers의 개수(numbers.length)만큼 나누면 평균값이 구해진다.
  • Array.stream() : 배열을 스트림으로 변환할 때 사용한다. 
  • average() : stream으로 바꾼 numebers의 평균값을 구할 때 사용한다.
  • orElse() : 평균값이 있으면 해당 평균값을 반환하고 없으면 ()안의 값인 0을 반환한다.

 

25. 짝수 홀수 개수

정수가 담긴 리스트 num_list가 주어질 때, num_list의 원소 중 짝수와 홀수의 개수를 담은 배열을 return

import java.util.stream.IntStream;
import java.util.Arrays;

class Solution {
    public int [] solution(int[] num_list) {
        int[] answer = new int[2]; // 짝수와 홀수의 개수만 저장하면 되므로 크기 2로 설정
        int odd = 0, even = 0;
        for (int num : num_list) {
            if (num % 2 == 0) {
                even += 1;
            } else {
                odd += 1;
            }
        }
        answer[0] = even;
        answer[1] = odd;
        
        return answer;
        
       //위 코드 간략화
       for (int i = 0; i < numbers.length; i++) {
           answer[numbers[i] % 2]++;
       }
       
       //stream 사용
       return IntStream.of((int)) Arrays.stream(num_list).filter(i -> i % 2 ==0).count(), (int) Arrays.stream(num_list).filter(i -> i % 2 == 1).count()).toArray();
    }
}
  • num_list의 값을 반복문으로 순회하며 각 값을 2로 나눈 나머지가 0이면 짝수의 개수를 늘리고 1일 경우 홀수의 개수를 늘리면 된다. 그리고 구해진 값을 배열에 넣어준다.
  • 간략화 코드는 결과 값이 0과 1만 나온다는 것을 이용해 배열의 값을 저장한 것임(answer[numbers[i] % 2]의 결과는 0과 1, ++ 후위 증감 연산을 통해 answer[0, 1]의 값을 각각 증가 시켜주는 것으로 짝수와 홀수의 개수를 저장할 수 있음.
  • stream 사용 방법의 경우 Intstream을 생성하고 Array.stream의 filter 기능을 사용하여 num_list의 값을 2로 나눈 결과를 각각 저장하는 방식.

 

 

26. 배열 자르기

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return

import java.util.Arrays;

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int[] answer = Arrays.copyOfRange(numbres, num1, num2+1);
        return answer;
    }
}

 

Arrays.copyOfRange() : 지정한 배열에서 특정 범위만큼의 요소들을 복사해 새로운 배열로 반환한다. 복사할 배열의 길이가 복사를 끝낼 인덱스로 입력한 길이보다 작을 경우 원본 배열의 마지막 인덱스 이후의 값은 배열 타입 기본값으로 초기화 되어 copy된다. (복사를 시작할 인덱스로 복사할 원본 배열의 길이보다 큰 값을 주면 에러가 발생함)

  • Arrays.copyOfRange(numbers, num1, num2+1) : 복사할 원본 배열을 numbers로, 복사를 시작할 인덱스를 num1, 복사를 끝낼 인덱스를 num2+1로 지정(num2로 할 경우 num2 위치의 인덱스가 포함되지 않음).

 

 

27. 배열 원소의 길이

문자열 배열 strlist가 매개변수로 주어진다. strlist 각 원소의 길이를 담은 배열을 return

import java.util.Arrays;

class Solution {
    public int[] solution(Stringp[] strlist) {
        int[] strCount = new int[strlist.length];
        
        for (int i = 0; i < strlist.length; i++) {
            strCount[i] = strlist[i].length();
        }
        return strCount;
        
        // stream 사용
        int[] answer = Arrays.stream(str).mapToInt(String::length).toArray();
    }
}
  • strlist의 크기만큼 배열 strCount를 생성 후 반복문을 통해 strlist의 각 원소의 길이를 담는다(length() 사용).
  • Arrays.stream의 mapToInt를 사용해서 쉽게 길이를 구해 배열에 넣을 수도 있음.

mapToInt : 스트림을 IntStream으로 변환한다. (intStream을 제외한 모든 스트림에서 동일하게 제공하는 메서드

::(이중 콜론 연산자) : 람다식에서 파라미터를 중복해서 사용하지 않을 때 사용.

 

 

28. 배열 뒤집기

정수가 들어 있는 배열 num_list가 매개변수로 주어질 때, num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return

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

class Solution {
    public int[] solution(int[] num_list) {
        int [] answer = new int[num_list.length];
        for (int i = 0; i < num_list.length; i++) {
            int j = (num_list.length - 1) - i;
            if (num_list.length - 1 != 0) {
                answer[i] = num_list[j];
            } else {
                answer[i] = num_list[i];
            }
        }
        return answer;
        
        // Collections.reverse() 사용
        List<Integer> list = Arrays.stream(num_list).boxed().collect(Collectors.toList());
        
        Collections.reverse(list);
        answer = list.stream().mapToInt(Integer::intValue).toArray();
    }
}
  • answer를 num_list.length의 크기로 하는 배열로 생성, 반복문과 조건문을 사용해서 원소의 순서를 거꾸로 바꾸고 answer에 저장한다.
  • for문을 통해 num_list 각 원소에 접근, j는 배열의 길이에서 -1과 i를 뺀 값으로 반복문을 통해 num_list의 마지막 배열부터 첫 배열까지로 지정된다.
  • 조건문을 통해 num_list 배열 길이에서 -1한 값이 0이 아닐 경우 answer[ i ]의 값으로 num_list[ j ]의 값을 저장하고 아닐 경우 answer[ i ]의 값으로 num_list[ i ]의 값을 저장하는 것으로 배열의 순서를 뒤집은 배열을 만들 수 있음
  • Collections.reverse()를 사용하면 더 쉽게 배열의 순서를 뒤집을 수 있음

Collections : collections에 사용할 정적 유틸리티 메서드 모임이 있는 java.util.Collections 클래스

  • 컬렉션 프레임워크 타입의 객체에 사용하거나 컬렉션을 반환하는 static 메서드로 구성
  • 수정을 허용하지 않음
  • 컬렉션 프레임워크 타입의 객체에 대한 객체 생성, 정렬, 병합, 검색 등의 알고리즘이 구현되어 있는 클래스
  • 메서드
    • unmodifiableList(List<? extends T > list) : view에 특화된 추가, 삭제할 수 없는 List 반환, 모듈은 내부 목록에 대한 읽기 전용 엑세스 제공 가능
    • emptyList() : 불변의 List를 반환, 반환된 List는 직렬화 가능.
    • singletonList(T o) : 인자로 넘긴  객체 하나만 포함하는 불변의 list를 반환
    • shuffle(List<?>list) : 미리 지정된 임의의 조건에 따라 컬렉션 요소를 무작위로 변경
    • sort(List list) : 프리미티브 타입(오름차순으로 정렬), 래퍼런스 타입(Comparable을 구현한 클래스 조건에 따라 정렬)
    • reverse(List list) : sort의 역순으로 정렬
    • max(Collection<? extends T> coll) : 비교한 요소 중 의미상 가장 큰 값을 찾는다(프리미티브 타입), Comparable을 구현한 클래스 조건에 다라 비교한 요소 중 가장 큰 값을 찾음(래퍼런스 타입)
    • min(Collection<? extends T>coll) : max의 반대로 최소 값을 찾음.

 

29. 최대값 만들기

정수 배열 numbers가 매개변수로 주어질 때 numbers의 원소 중 두 개를 곱해 만들 수 있는 최대값을 return

import java.util.Arrays;

class Solution {
    public int solution(int[] numbers) {
        int max = 0;
        Arrays.sort(numbers);
        int num1 = numbers.length - 1;
        int num2 = numbers.length - 2;
        max = numbers[num1] * numbers[num2]
        
        return max;
        
        // 간략화
        max = numbers[numbers.length-1] * numbers[numbers.length-2]
    }
}
  • Arrays.sort()를 사용해 오름차순 정렬 후 numbers의 마지막 인덱스와 그 전 인덱스를 각각 num1과 num2에 저장한 후 numbers에서 꺼내고 곱한 값을 max에 저장한다.

'항해 99 > Java' 카테고리의 다른 글

Java 기초 4 - 훈련  (1) 2024.01.22
Java 문법 기초 테스트-3  (1) 2024.01.22
Java 문법 기초 테스트-1  (0) 2024.01.20
Java 문법 종합 2주차-2  (0) 2024.01.17
Java 문법 종합 2주차-1  (0) 2024.01.16