coding_test

[99클럽 4기 코테 스터디 TIL 1일차] 문자열 내 p와 y의 개수

jeri 2024. 10. 28. 20:07
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12916?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

1) 내가 구현한 코드

class Solution {
    boolean solution(String s) {
        boolean answer = false;

        int pCnt = 0;
        int yCnt = 0;
        
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == 'p' || s.charAt(i) == 'P') pCnt++;
            else if(s.charAt(i) == 'y' || s.charAt(i) == 'Y') yCnt++;
        }

        if(yCnt == pCnt) answer = true;
        
        return answer;
    }
}

2) 오늘의 학습 키워드

  • 문자열 순회 및 문자 개수 카운팅
  • 대소문자 구별하지 않는 문자 비교
  • Java 문자열 메서드 (toLowerCase, toUpperCase, chars)
  • String.chars()
    • 자바에서 String 객체에 포함된 각 문자를 정수형 스트림(IntStream)으로 반환하는 메서드
    •  이 스트림을 사용하면 문자열의 각 문자를 쉽게 순회하고,
    • 특정 조건을 만족하는 문자만 필터링하거나 카운팅 가능
    • ex. filter(), count(), forEach() 같은 스트림 연산을 조합하여 문자열을 효율적으로 다룰 수 있게 해줌
  • 반복문 + String.charAt(int index)을 통해 하나씩 순회 가능

3) 공부한 내용 정리

이 문제는 문자열에서 특정 문자의 개수를 비교하여 조건에 따라 참 또는 거짓을 반환하는 문제이다.

주요 학습 포인트는 다음과 같다.

  1. 문자 개수 세기
    • 문자열 내 특정 문자('p'와 'y')의 개수를 비교하기 위해 문자열 전체를 순회하면서 해당 문자의 개수를 카운팅한다.
  2. 대소문자 구별 없이 처리하기
    • 대문자와 소문자를 구별하지 않도록 전체 문자열을 소문자나 대문자로 변환하여 개수를 비교한다.
    • 이를 위해 toLowerCase() 또는 toUpperCase() 메서드를 사용할 수 있다.
  3. 문자열 메서드 활용
    • Java에서는 toLowerCase()로 소문자로 변환하고 chars().filter()를 이용해 특정 문자의 개수를 쉽게 세는 방법을 사용할 수 있다.

4) 문제 해결 과정

  1. 문제 접근:
    • 문자열 s를 소문자로 변환하여 'p'와 'y'의 개수를 구한다.
    • p와 y의 개수가 같다면 true, 다르면 false를 반환하는 조건을 만든다.
    • 만약 p와 y가 모두 없는 경우에도 true를 반환하도록 처리한다.
  2. 문제 해결 시도:
    • toLowerCase로 문자열을 소문자로 변환하여 대소문자 문제를 해결한다.
    • chars() 메서드를 사용하여 p와 y 문자의 개수를 필터링하고 카운팅한다.
  3. 추가 구현 코드:
public class Solution {
    public boolean solution(String s) {
        String lowerCaseStr = s.toLowerCase();
        long countP = lowerCaseStr.chars().filter(ch -> ch == 'p').count();
        long countY = lowerCaseStr.chars().filter(ch -> ch == 'y').count();
        return countP == countY;
    }
}

5) 오늘의 회고

  • 문제점
    • 문자열 내 문자 개수를 세는 메서드에 익숙하지 않아 다양한 시도를 했다.
  • 시도한 방법
    • 처음에는 단순 for문을 통해 하나씩 조건을 검사하며 카운팅하는 방식을 시도했으나,
    • chars()를 사용한 필터링 방식이 더 깔끔하고 효율적이라는 것을 알게 되었다.
  • 새롭게 알게 된 것
    • chars().filter()를 활용하면 특정 문자의 개수를 빠르게 세는 방법을 익혔다.
  • 내일 학습 목표
    • 다양한 문자열 처리 메서드, 스트림 활용법 더 깊게 학습하기

 

 

Q1: 만약 문자열을 대문자로 변환해서 개수를 세는 방식과 비교할 때, 성능 차이가 있을까?

Q2: chars().filter() 외에도 특정 문자의 개수를 셀 수 있는 다른 방식은 어떤 것들이 있을까?

Q3: 이 문제를 해결할 수 있는 또 다른 언어의 코드는 어떻게 다를까?

 

 

 

6) 추가 문제

미들러 - 게임

https://www.acmicpc.net/problem/1072

챌린저 - 경로찾기

https://www.acmicpc.net/problem/11403

 

반응형