[99클럽 코테 스터디_ DAY 3] 특정 문자열 개수

yewon·2024년 7월 24일
0

스터디

목록 보기
3/22
post-thumbnail

문자열 내의 p와 y의 개수

✏️오늘의 문제 : 문자열 내의 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()메서드를 이용하여 문자열을 비교하고 개수를 카운트할 수 있도록해주었습니다. 그 후에 삼항 연산자를 이용하여 답을 리턴하였습니다.



💡나의 풀이 2


	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();
  }
  1. 대문자로 변환:

    • s = s.toUpperCase();는 입력된 문자열 s의 모든 문자를 대문자로 변환합니다.
    • 이로 인해 'p'와 'P', 'y'와 'Y'를 동일하게 처리할 수 있게 됩니다.
  2. 문자 열을 스트림으로 변환:

    • s.chars()는 문자열 s를 정수 스트림으로 변환합니다. 각 문자는 해당 ASCII 값으로 표현됩니다.
    • 예를 들어, 'A'는 65, 'P'는 80, 'Y'는 89입니다.
  3. 필터링 및 카운트:

    • filter(e -> 'P' == e)는 스트림에서 ASCII 값이 'P' (즉, 80)인 문자만 남깁니다.
    • .count() 메서드는 필터링된 결과의 개수를 세어 반환합니다.
    • 같은 방식으로 filter(e -> 'Y' == e)는 'Y' (즉, 89)의 개수를 셉니다.
  4. 비교:

    • 두 개의 count() 결과를 비교합니다. 즉, 'P'의 개수가 'Y'의 개수와 같은지를 확인합니다.
    • 같으면 true, 다르면 false를 반환합니다.


➕ 참고: .chars() 메서드

Java에서 chars() 메서드는 String 클래스의 메서드로, 문자열을 IntStream으로 변환하는 기능을 제공합니다. 이 메서드는 Java 8에서 도입된 Stream API의 일부로, 문자열의 각 문자를 정수형 ASCII 값으로 표현합니다.

chars() 메서드의 사용법

  • 구문:

    IntStream chars()
  • 반환 값:

    • 이 메서드는 IntStream을 반환하며, 이 스트림은 문자열의 각 문자의 Unicode 코드 포인트(정수값)를 포함합니다.

예시

  1. 기본 사용법:

    String str = "Hello";
    IntStream stream = str.chars();
    stream.forEach(System.out::println); // 각 문자의 ASCII 값을 출력

    이 코드는 다음과 같은 출력 결과를 생성합니다:

    72  // 'H'
    101 // 'e'
    108 // 'l'
    108 // 'l'
    111 // 'o'
  2. 문자 필터링:

    String str = "Hello World";
    long countA = str.chars().filter(e -> e == 'o').count(); // 'o'의 개수 세기
    System.out.println(countA); // 2
  3. 문자 변환:

    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"

주요 특징

  • 정수형 Unicode 값: chars() 메서드는 각 문자의 Unicode 값(정수형)을 제공하므로, 문자 자체가 아닌 그 코드 포인트를 사용하여 작업할 수 있습니다.
  • Stream 처리: IntStream을 반환하므로, 필터링, 매핑, 집계 등의 다양한 스트림 연산을 사용할 수 있습니다.
  • 편리함: 문자열을 간편하게 처리할 수 있는 방법을 제공하며, 특히 대량의 문자열 데이터를 처리할 때 유용합니다.

➕ 참고: 람다와 .filter()메서드

Java에서 filter와 람다 표현식은 Stream API와 함께 사용되어 데이터를 효율적으로 처리하는 데 매우 유용합니다. 아래에서 각각에 대해 설명하겠습니다.

1. 람다 표현식 (Lambda Expressions)

람다 표현식은 Java 8에서 도입된 기능으로, 익명 함수(이름이 없는 함수)를 간결하게 표현할 수 있는 방법입니다. 주로 함수형 인터페이스를 구현하는 데 사용됩니다.

기본 구문

(parameters) -> expression
  • parameters: 입력 매개변수 (0개 이상)
  • expression: 실행될 코드 (단일 표현식 또는 블록)

예시

// 두 수를 더하는 람다 표현식
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println(add.apply(5, 3)); // 8

2. filter 메서드

filter 메서드는 스트림에서 주어진 조건에 맞는 요소만 남기는 역할을 합니다. 이 메서드는 Predicate 유형의 람다 표현식을 인자로 받습니다.

구문

Stream<T> filter(Predicate<? super T> predicate)
  • 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 메서드는 스트림에서 주어진 조건을 만족하는 요소만 남기고, 람다 표현식을 인자로 받아 조건을 정의합니다.
  • 이 두 가지는 함께 사용되어 데이터를 필터링하고 처리하는 데 매우 강력한 도구가 됩니다.

0개의 댓글