2019년 1월 30일 수요일

#11 알고리즘연습 - 문자열내 p와 y의 개수 -JAVA


문자열내 p와 y의 개수


문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를들어 s가 pPoooyY면 true를 return하고 Pyy라면 false를 return합니다.
제한사항
  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.


입출력 예
sanswer
pPoooyYtrue
Pyyfalse
입출력 예 설명
입출력 예 #1
'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
입출력 예 #2
'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.






문제풀이 IDEA

JAVA에 count를 해주는 메서드가 있으면 가져다 쓰면 좋겠지만

count를 해주는게 따로 없으므로 for-loop 를 돌려서 count를 해주고

count값을 비교해서 true false를 리턴해준다




나의코드⭐

1


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

import java.util.*;

class Solution {
    boolean solution(String s) {
        int pcnt = 0;                 //p의 갯수를 저장
        int ycnt = 0;                 //y의 갯수를 저장

        for(int i = 0 ; i< s.length(); i++){
            if(String.valueOf(s.toLowerCase().charAt(i)).equals("p")){
                pcnt++;           //p와 P에 대해 2번 세지 않기 위해 LowerCase로 들어오는 string을 소문자로 바꿔줌 charAt을 이용하여 index 0부터                                    차례대로 글자를 뽑아 char로 반환하는데 equals을 쓰기위해 valueOf로 char을 String으로 바꾸어 비교
            }                       
            if(String.valueOf(s.toLowerCase().charAt(i)).equals("y")){
                ycnt++; 
            }
        } 

        if (pcnt == ycnt){
            return true;         //다른 코드를 보고 든  IDEA중에는 
        }else{                     pcnt == ycnt를 비교하는 반환값 자체가 true false이므로
            return false;          if문 자체를 return pcnt == ycnt 로 바꿔줘도 되겠다. 
        }
    }
}



다른코드⭐

1
2
3
4
5
6
7
8

class Solution {
    boolean solution(String s) {
        s = s.toUpperCase();      //s를 대문자로 통일하여 비교하기 쉽게 해주었다

        return s.chars().filter( e -> 'P'== e).count() == s.chars().filter( e -> 'Y'== e).count();
    }   //자바8의 람다식을 이용해서 string의 stream을 탐색하며 하나하나의 char를
}         filter( e -> 'P'==e)로 걸러내 P(혹은 Y)와 같은 char만을 남긴 stream을 만들고
그 갯수를 count로 세어 비교값을 출력해준다

(그런데 이떄 String.chars()로 반환되는 stream은 char code를 나타내는 intstream이다)




더 알아보기


Stream VS for-loop


JAVA8에 새로 도입된 Stream과 Lambda식이 코드를 보다 간결하게 작성해준다고 생각하고 있었는데

위의 블로그 글을 보면 상황에 맞게 사용을 해야 코드의 가독성 및 간결성 및
효율성도 보장할수 있다고 설명 하는 것 같다.

새로운 기술을 가져다가 쓰는게 마냥 좋은줄 알았는데 해당 블로그 글을 읽고
이번 알고리즘 문제는 for-loop를 이용해서 구현해보았다.


equals()


string에서 charAt()으로 char을 뽑아왔는데 char 과 "p"(string)을 비교하려 하니 equals를 사용할수 없었다.

String과 String을 비교할때 equals()를 쓰므로 char을 string으로 바꾸어 equals()로 비교해줬다


출처:https://programmers.co.kr

댓글 없음:

댓글 쓰기

가장 많이 본 글