코딩테스트 Java 입문 단계 문제 풀이 코드
30. 키 큰 사람
사람들의 키가 담긴 정수 배열 array와 본인의 키 height가 매개변수로 주어질 때, 본인보다 키 큰 사람 수를 return
class Solution {
public int solution(int[] array, int height) {
int count = 0;
for (int num : array) {
if (height < num) {
count += 1;
}
}
return count;
// 삼항 연산자 사용
for (int num : array) {
count += (num > height) ? 1 : 0;
}
}
}
- 반복문을 통해 array의 각 값을 height와 비교하여 height보다 클 경우 count를 1씩 증가하도록 한다.
31. 배열 두 배 만들기
정수 배열 numbers가 매개변수로 주어짐, numbers의 각 원소에 두 배한 원소를 가진 배열을 return
import java.util.Arrays;
class Solution {
public int[] solution(int[] numbers) {
int[] result = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) {
result[i] = numbers[i] * 2;
}
return result;
// stream 사용
result = Arrays.stream(numbers).map(i -> i * 2).toArray();
}
}
- numbers와 같은 크기의 배열 result 생성 반복문을 통해 numbers의 각 값에 2를 곱한 값을 result에 저장한다.
- Arrays.stream을 사용해 코드를 간략화 할 수 있다.
32. 삼각형의 완성 조건
선분 3개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 함.
- 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 한다.
삼각형 3 변의 길이가 담긴 배열 sides가 매개변수로 주어짐, 3 변으로 삼각형을 만들 수 있으면 1을 만들 수 없으면 2를 return
import java.util.Arrays;
class Solution {
public int solution(int[] sides) {
Arrays.sort(sides);
int answer = (sides[2] < (sides[0] + sides[1])) ? 1 : 2;
return answer;
}
}
- Arrays.sort를 사용해 정렬 뒤 가장 큰 값과 나머지 두 값의 합의 크기를 비교하여 큰 값이 합보다 작으면 1을 크면 2를 반환한다.
33. 중앙값 구하기
어떤 주어진 값들의 크기의 순서대로 정렬했을 때의 가장 중앙에 위치하는 값을 의미하는 것이 중앙값이다. 정수 배열 array가 매개변수로 주어질 때 중앙값을 return
import java.util.Arrays;
class Solution {
public int solution(int[] array) {
Arrays.sort(array);
int answer = array[array.length/2];
return answer;
}
}
- Array.sort로 정렬한 후 배열의 크기를 2로 나눈 값을 Array의 인덱스로 사용하면 중앙값을 구할 수 있다.
34. 짝수는 싫어요
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
class Solution {
public int[] solution(int n) {
int stop = 0;
Stream<Integer> = odd;
if (n % 2 == 0) {
odd = Stream.iterate(1, i -> i + 2).limit(n / 2);
} else {
odd = Stream.iterate(1, i -> i + 2).limit(n / 2+1);
}
Integer[] intArray = odd.toArray(Integer[]::new);
int[] result = Array.stream(intArray).mapToInt(i -> i).toArray();
return result;
//Intstream 사용 간략화
IntStream.rangeClosed(0, n).filter(value -> value % 2 == 1).toArray();
}
}
- Stream의 iterate를 사용해서 1부터 2씩 증가하는 값을 저장한다(limit는 n을 2로 나눈 값으로 지정, 2로 나누고 나머지가 발생하는 값은 limit에 1을 더한다).
- 홀수 값들이 저장된 Stream을 Integer 배열로 바꾼 후 Array.stream의 mapToInt를 사용해 int 배열로 바꿔준다.
- IntStream의 rangeClosed와 filter 기능을 사용하여 홀수 값을 저장하고 toArray로 배열로 변환하는 것으로 간략화 할 수 있다.
- Stream.iterate() : 초기값과 해당 값을 다루는 람다를 통해 스트림에 들어갈 요소를 만든다(예제에서는 1이 초기 값이고 2씩 증가하는 값이 들어가게 설정), 스트림의 사이즈가 무한하기 때문에 특정 사이즈로 제한해야 한다.
- IntStream.rangeClosed() : 스트림에 특정 범위의 숫자를 차례대로 생성해주는 기능을 가진다, rangeClosed는 종료 값을 포함해서 반환한다.
35. 배열의 유사도
두 배열이 얼마나 유사한 지 확인하려고 한다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
class Solution {
public int solution(String[] s1, String[] s2) {
int answer = 0;
for (String str : s1) {
for (String str2 : s2) {
if (str.equals(str2)) {
answer += 1;
}
}
}
return answer;
//set, stream 사용 방법
Set<String> set = new HashSet<>(Arrays.asList(s1));
answer = (int) Arrays.stream(s2).filter(set::contains).count();
}
}
- 중첩 반복문과 조건문을 사용해 str1과 str2의 요소에 접근하고 equals를 통해 값이 같을 경우 answer를 증가시키는 것으로 두 배열 내의 같은 원소 개수를 구할 수 있다.
- set과 stream을 사용하여 구할 수도 있다.
- String을 저장하는 Set을 생성하고 Array.asList()를 통해 s1을 ArrayList로 변환하여 set에 저장한다.
- Arrays.stream의 filter 기능을 사용해 set에 s2의 원소가 포함되어 있는지 확인하고(contains 사용) 포함된 수를 count()한 후 int로 변환 후 answer에 대입한다.
36. 자릿수 더하기
정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return
import java.util.stream.Stream;
class Solution {
public int solution(int n) {
int answer = 0;
int[] arrNum = Stream.of(String.valueOf(n).split("")).mapToInt(Integer::parseInt).toArray();
for (int num : arrNum) {
answer = answer + num;
}
return answer;
// while문 사용
while (n > 0) {
answer += n % 10;
n /= 10;
}
}
}
- Stream을 사용해 입력한 정수 n을 문자열로 반환하고 각 자릿수를 문자열 배열로 분리한다.
- mapToInt()를 사용해 각 문자열을 정수로 변환하고 toArray()로 정수 배열로 변환한다.
- 반복문을 통해 정수 배열의 각 값을 answer에 더해준다.
- while문을 사용해 정수 n을 10을 나눈 나머지를 answer에 저장한 후 n을 10으로 나눈다.
- n을 10으로 나누는 것으로 일의 자리 수를 제거한다 반복문을 통해 정수 n을 10으로 나눈 나머지를 answer에 더하고 10으로 나누는 것으로 더한 자리 수를 제거하는 것으로 배열의 각 자릿 수의 합을 구할 수 있다.
37. 순서쌍의 개수
순서쌍: 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍 (a, b)로 표기.
자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return
import java.util.stream.IntStream;
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0) {
answer++;
}
}
return answer;
// intStream 사용 방법
answer = (int) IntStream.rangeClosed(1, n).filter(i -> n % i == 0).count();
}
}
- 반복문을 통해 n을 i로 나눈 값이 0이 될 때만 answer의 수를 증가시키는 것으로 순서쌍의 개수를 쉽게 구할 수 있다.
- IntStream을 사용할 경우 rangeClosed를 사용해 1부터 n까지의 수를 생성하고 필터 기능으로 n % i로 나눈 나머지가 0이 될 때만 count하여 순서쌍의 개수를 구할 수 있다.
38. 개미군단
장군 개미 공격력 5, 병정 개미 공격력 3, 일개미 공격력 1이다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구하려면 몇 마리의 개미가 필요한지 return
class Solution {
public int solution(int hp) {
int result = hp / 5 + hp % 5 / 3 + hp % 5 % 3;
return result;
}
}
- 사냥감의 체력에서 장군 개미(공격력)를 나눈 값, 체력에서 장군 개미를 나누고 나머지에 병정 개미를 나눈 값, 체력에서 장군 개미를 나눈 나머지에 병정 개미를 나누고 남은 나머지 값. 3가지 값을 더하면 사냥감 체력에 딱 맞는 최소 개미 수를 구할 수 있다.
39. 숨어있는 숫자의 덧셈(1)
문자열 my_string이 매개변수로 주어질 때, my_string 안의 모든 자연수들의 합을 return
import java.util.stream.Collectors;
class Solution {
public int solution(String my_string) {
int answer = 0;
answer = my_string.chars().filter(Character::isDigit).map(Character::getNumericValue).sum();
return answer;
// 정규식
String str = my_string.replaceAll("[^0-9]", "");
for (char ch : str.toCharArray()) {
answer += Character.getNumericalValue(ch);
}
}
- stream을 사용하는 방법
- my_string.chars() : 문자열을 IntStream으로 변환한다.(각 문자는 해당하는 ASCII 값으로 매핑)
- .filter(Character::isDigit) : filter 기능을 사용하여 숫자인 문자만 필터링한다.
- isDigit() : char 값이 숫자 인지 여부를 판단하여 true 또는 false를 리턴
- .map(Character::getNumericValue) : 각 숫자 문자를 정수 값으로 매핑
- getNumericValue : 숫자 형태의 문자(char)를 정수(int)로 변환
- .sum() : 스트림의 모든 정수 값을 합산
- 정규식 사용
- repalceAll을 사용해 숫자 값을 제외한 모든 값을 제거한다.
- 반복문을 통해 문자열의 각 원소를 char로 변환한 값을 .getNumericValue를 통해 int 타입으로 변환 후 answer에 더해준다.
40. 문자열 정렬하기(1)
문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 list를 return
import java.util.Arrays;
class Solution {
public int[] solution(String my_string) {
String str = my_string.replaceAll("[^0-9]", "");
int[] answer = Arrays.stream(str.split("")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(answer);
return answer;
}
}
- replaceAll()과 정규 표현식을 사용해서 문자열 내에서 숫자만 선택( [^0-9] : 0~9까지의 숫자를 모두 선택)
- Array.stream을 사용해서 문자열을 나누고 mapToInt로 문자인 숫자를 int타입으로 형변환 후 toArray()를 사용해 배열로 변환한다.
- Array.sort를 사용해 오름차순 정렬한다.
'항해 99 > Java' 카테고리의 다른 글
Java 기초 5 - 배열 (0) | 2024.01.22 |
---|---|
Java 기초 4 - 훈련 (1) | 2024.01.22 |
Java 문법 기초 테스트-2 (0) | 2024.01.20 |
Java 문법 기초 테스트-1 (0) | 2024.01.20 |
Java 문법 종합 2주차-2 (0) | 2024.01.17 |