✏️오늘의 문제 : 문자열 내의 p와 y의 개수 비교하는 함수 만들기
boolean solution(String s) {
boolean answer = true;
int p = 0, y=0;
for(int i=0; i<s.length();i++){
if(s.charAt(i) == 'p' || s.charAt(i) == 'P'){
p++;
} else if(s.charAt(i) == 'y' || s.charAt(i) == 'Y'){
y++;
}
}
answer = p==y ? true: false;
return answer;
}
charAt()메서드를 이용하여 문자열을 비교하고 개수를 카운트할 수 있도록해주었습니다. 그 후에 삼항 연산자를 이용하여 답을 리턴하였습니다.
boolean solution(String s) {
boolean answer = true;
s= s.toUpperCase();
int count = 0;
for(int i=0; i<s.length();i++){
if( s.charAt(i) == 'P'){
count++;
} else if(s.charAt(i) == 'Y'){
count--;
}
}
answer = count==0 ? true: false;
return answer;
}
대소문자를 상관하지 않기 때문에 toUpperCase를 이용하여 모두 대문자로 바꾸었습니다. 처음에는 p와 y의 개수를 각각 다른 변수에 담았지만 한개의 변수에 담아 문제를 해결해보았습니다.
boolean solution(String s) {
s = s.toUpperCase();
return s.chars().filter( e -> 'P'== e).count() == s.chars().filter( e -> 'Y'== e).count();
}
대문자로 변환:
s = s.toUpperCase();
는 입력된 문자열 s
의 모든 문자를 대문자로 변환합니다. 문자 열을 스트림으로 변환:
s.chars()
는 문자열 s
를 정수 스트림으로 변환합니다. 각 문자는 해당 ASCII 값으로 표현됩니다.필터링 및 카운트:
filter(e -> 'P' == e)
는 스트림에서 ASCII 값이 'P' (즉, 80)인 문자만 남깁니다..count()
메서드는 필터링된 결과의 개수를 세어 반환합니다.filter(e -> 'Y' == e)
는 'Y' (즉, 89)의 개수를 셉니다.비교:
count()
결과를 비교합니다. 즉, 'P'의 개수가 'Y'의 개수와 같은지를 확인합니다.true
, 다르면 false
를 반환합니다.Java에서 chars()
메서드는 String
클래스의 메서드로, 문자열을 IntStream
으로 변환하는 기능을 제공합니다. 이 메서드는 Java 8에서 도입된 Stream API의 일부로, 문자열의 각 문자를 정수형 ASCII 값으로 표현합니다.
chars()
메서드의 사용법구문:
IntStream chars()
반환 값:
IntStream
을 반환하며, 이 스트림은 문자열의 각 문자의 Unicode 코드 포인트(정수값)를 포함합니다.기본 사용법:
String str = "Hello";
IntStream stream = str.chars();
stream.forEach(System.out::println); // 각 문자의 ASCII 값을 출력
이 코드는 다음과 같은 출력 결과를 생성합니다:
72 // 'H'
101 // 'e'
108 // 'l'
108 // 'l'
111 // 'o'
문자 필터링:
String str = "Hello World";
long countA = str.chars().filter(e -> e == 'o').count(); // 'o'의 개수 세기
System.out.println(countA); // 2
문자 변환:
String str = "abc";
String upperCaseStr = str.chars()
.mapToObj(c -> (char) c) // 각 정수 값을 문자로 변환
.map(Character::toUpperCase) // 대문자로 변환
.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
.toString();
System.out.println(upperCaseStr); // "ABC"
chars()
메서드는 각 문자의 Unicode 값(정수형)을 제공하므로, 문자 자체가 아닌 그 코드 포인트를 사용하여 작업할 수 있습니다.IntStream
을 반환하므로, 필터링, 매핑, 집계 등의 다양한 스트림 연산을 사용할 수 있습니다.Java에서 filter
와 람다 표현식은 Stream API와 함께 사용되어 데이터를 효율적으로 처리하는 데 매우 유용합니다. 아래에서 각각에 대해 설명하겠습니다.
람다 표현식은 Java 8에서 도입된 기능으로, 익명 함수(이름이 없는 함수)를 간결하게 표현할 수 있는 방법입니다. 주로 함수형 인터페이스를 구현하는 데 사용됩니다.
(parameters) -> expression
// 두 수를 더하는 람다 표현식
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(5, 3)); // 8
filter
메서드filter
메서드는 스트림에서 주어진 조건에 맞는 요소만 남기는 역할을 합니다. 이 메서드는 Predicate
유형의 람다 표현식을 인자로 받습니다.
Stream<T> filter(Predicate<? super T> predicate)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
// 'A'로 시작하는 이름 필터링
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("A")) // 람다 표현식 사용
.collect(Collectors.toList());
System.out.println(filteredNames); // [Alice]
}
}
람다 표현식과 filter
메서드는 함께 자주 사용됩니다. 예를 들어, 주어진 리스트에서 특정 조건(예: 길이가 5자 이상인 문자열)을 만족하는 요소만 선택할 수 있습니다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("Java", "Python", "C", "JavaScript", "Go");
// 길이가 5 이상인 단어 필터링
List<String> longWords = words.stream()
.filter(word -> word.length() >= 5) // 람다 표현식
.collect(Collectors.toList());
System.out.println(longWords); // [Python, JavaScript]
}
}
filter
메서드는 스트림에서 주어진 조건을 만족하는 요소만 남기고, 람다 표현식을 인자로 받아 조건을 정의합니다.