ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스-문자열 내 p와 y의 개수
    히딘쓰의 책상/└ java 2020. 12. 16. 01:50

     

    오늘은 자바로 코딩테스트 문제를 풀어보았다!

     

    바로 문자열 내에서 p 와 y의 개수에 따라 true 나 false의 값을 반환해주는 문제였다.

    처음 생각은 대문자와 소문자를 구별하지 않는 다고 해서 

    문자열을 받은 후에 전부 소문자로 바꿔주고 그 다음 처리를 하려고 했다.

    그런데 다음과 같이 코드를 짯는데 51점을 받고 실패ㅜㅜ

    class Solution {
        boolean solution(String s) {
            boolean answer = true;
            String str = s;
            int pcnt=0, ycnt=0;
            String[] splitStr = str.split("");
            
            str = str.toLowerCase();
            
            for(int i=0; i<splitStr.length; i++){
                if(splitStr[i].equals("p")){
                    pcnt++;
                }else if(splitStr[i].equals("y")){
                    ycnt++;
                }
            }
            
            if(pcnt!=ycnt){
                answer=false;
            }
            
            return answer;
        }
    }

     

    그래서 뭐가 문제인지 생각하다가 그냥 소문자로 바꿔주지 않고 

    아래처럼 p,y이거나 P,Y일 때 카운트를 해주면 어떨까 하고 바꾼 결과 통과! 정답!

    아! 그리고 

    String str = s;

    도 굳이 필요없는 것 같아 지워주었다!

    class Solution {
        boolean solution(String s) {
            boolean answer = true;
            int pcnt=0, ycnt=0;
            String[] splitStr = s.split("");
            
            //문자열을 소문자로 바꿔주는 부분 주석처리
            //s = s.toLowerCase();
            
            for(int i=0; i<splitStr.length; i++){
                if(splitStr[i].equals("p") || splitStr[i].equals("P")){
                    pcnt++;
                }else if(splitStr[i].equals("y") || splitStr[i].equals("Y")){
                    ycnt++;
                }
            }
            
            if(pcnt!=ycnt){
                answer=false;
            }
            
            return answer;
        }
    }

     

    그런데 처음 코드도 틀릴 이유가 없다고 생각해서 한줄 한줄 다시 보다가 나의 실수를 깨닳았다!

    처음 코드는 str을 split 해주고 splitStr에 넣어준 후에 애꿎은 str만 소문자로 변경해주었던 것이었다............

    splitStr을 선언한 이후에 str을 소문자로 변경하면 뭐해.................. 나 뭐해..........

    그래서 선언 위치를 변경했더니 이것도 정답으로 뜬다!

    하지만 내 느낌상 바로 위 코드보단 시간이 더 걸리는 느낌?

    소문자로 다 바꿔주는 걸 한 번 더 거치기 때문인 것 같다!

    class Solution {
        boolean solution(String s) {
            boolean answer = true;
            int pcnt=0, ycnt=0;
            
            s = s.toLowerCase();
            
            //splitStr의 선언 위치 변경!
            String[] splitStr = s.split("");
            
            for(int i=0; i<splitStr.length; i++){
                if(splitStr[i].equals("p")){
                    pcnt++;
                }else if(splitStr[i].equals("y")){
                    ycnt++;
                }
            }
            
            if(pcnt!=ycnt){
                answer=false;
            }
            
            return answer;
        }
    }

     

     

    그리고 대망의 다른 사람들 풀이..!

    람다식으로 정말 한두줄로 완성한 사람도 있고, split()을 사용하지 않고 

    charAt()을 사용한 사람도 있었다. 

    charAt()을 사용하면 splitStr 처럼 따로 또 변수 선언을 안해줘도 되규.. 

    split()을 사용하지만 더 짧게 끝낸 사람도 있규.. 

     

    아래는 charAt()을 사용해서 풀어본 코드다! 이방법 저방법 다써보쟈~~~~

    class Solution {
        boolean solution(String s) {
            boolean answer = true;
            int pcnt=0, 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(pcnt!=ycnt){
                answer=false;
            }
            
            return answer;
        }
    }

    와 이렇게 짯더니 통과 하는 시간대가 다 0.0몇ms대였다!

    그 전전꺼는 0.1-0.3ms대 였고 그 전꺼는 그 이상인 경우도 있었는데.... 

    큽 

    코딩은 정말이지 같은 문제여도 정말 정답이 다양하게 나오는 것 같다!

    하지만 어떻게든 일을? 더 적게 하면서 얼마나 효율적으로 짜느냐는 사람마다 다른 것 같다ㅜㅜㅜㅜㅜ

    나도 조금씩 더 짧고 효율적인 코드를 짜기 위해 노력해야지! 빠샤~!

Designed by Tistory.