본문 바로가기

Algorithm/프로그래머스

[프로그래머스/Java] 문자열 내 p와 y의 개수

728x90
반응형

class Solution {
	boolean solution(String s) {
    	boolean answer = true;
        String[] str = s.toLowerCase().split("");
        int countP = 0;
        int countY = 0;
        for(int i=0; i<str.length; i++) {
        	if(str[i].equals("p")){
            	countP++;
            } else if(str[i].equals("y")) {
            	countY++;
        	}
            
            if(countP == countY || (countP == 0 && countY == 0)) {
            	answer = true;
            } else {
            	answer = false;
            }
        }
        return answer;
    }
}

보자마자 생각난 코드다.

너무 길고 가독성도 떨어지고 아직 많이 부족함이 보인다.

찾아보니 문자열을 문자 배열로 변환 후, for-each 루프를 사용하여 각 문자를 반복하는 메소드가 있었다.

class Solution {
	boolean solution(String s) {
    	String lowercaes = s.toLowerCase();
        int countP = 0;
        int countY = 0;
        
        for(char c : lowercase.toCharArray()) {
        //toCharArray() 메소드를 사용하여 문자열을 문자 배열로 변환 후, 반복
        	if(c == 'p') {
            	countP++;
            } else if(c == 'y') {
            	countY++;
            }
        }
       	return countP == countY;
    }
}

좋은 코드인지는 모르겠지만 가독성을 더 좋게 만들어봤다.

 

다른 사람이 푼 코드를 보니

class Solution {
	boolean solution(String s) {
    	s = s.toUpperCase();
        return s.chars().filter(e->'P'==e).count()==s.chars().filter(e->'Y'==e).count();
    }
}

문자열을 대문자로 변환하고

P와 Y의 수가 같은지 비교한 후 결과를 반환하는 스트림을 이용한 코드이다.

 

s.chars() 문자열을 s의 모든 문자를 스트림 형태로(아스키코드)

filter(e -> 'P' == e) 스트림에서 람다 표현식을 만족하는 요소만 필터링

count() 필터링된 스트림의 요소의 수를 계산

 

스트림과 람다 공부를 열심히 해야겠다.

 

728x90
반응형