[Java] programmers lv 1. 문자열 내 y와 k의 개수

Eunbi Lee·2023년 6월 3일
1

Algorithm

목록 보기
2/7
post-thumbnail

문자열 내 y와 k의 개수

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

제한 조건

문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.

입/출력 예

s = "pPoooyY" / answer = true
s = "Pyy" / answer = false

풀이 1

// s = "pPoooyY"
class Solution {
	boolean solution(String s) {
    // s = "ppoooyy"
    s = s.toLowerCase();
    
    // count ++와 count --로 출력할 개수 변수
    int count = 0;
    
    for (int i = 0; i < s.length(); i ++) {
    	// s.charAt(0) == 'p'
    	if (s.charAt(i) == 'p')
        // count = 1
        	count ++;
        else if (s.charAt(i) == 'y')
        	count --;
    }
    
    if (count == 0)
    	return true;
    else
    	return false;
   }
}

위 풀이의 핵심은 다음과 같습니다.
1) int count = 0;
2) toLoswerCase();
2) if (s.charAt(i) == 'p') count ++; else if (s.charAt(i) == 'y') count --;

즉, count라는 변수 하나로 ++와 --를 반복하여 개수가 같다면 총 합 0이 된다는 점을 이용한 것이 재미있었습니다.

풀이 2

class Solution {
	boolean answer = true;
    
    int p = 0;
    int y = 0;
    
    for (int i = 0; i < s.length(); i ++) {
    	if (s.charAt(i) == 'p' || s.charAt(i) == 'P') {
        	p ++;
    	}
        if (s.charAt(i) == 'y' || s.charAt(i) == 'Y') {
        	y ++;
        }
    }
    
    // s 내에 'p' 또는 'P', 'y' 또는 'Y'가 하나도 없을 경우
    if (p + y == 0) {
    return true;
    }
    
    // p 변수와 y 변수의 값, 즉 개수가 동일할 경우 true 반환
    return p == y;
  }
}

위 풀이의 핵심은 다음과 같습니다.
1) if (s.charAt(i) == 'p' || s.charAt(i) == 'P') { p ++; }
2) if (p + y == 0) { return true; }
3) return p == y;

true 값 자체를 return하는 일반적인 풀이와 달리, 식을 통해 true 값이 return되게 하는 구조가 깔끔하다는 생각이 들었습니다 👍

풀이 3

class Solution {
	boolean solution(String s) {
    	int pcount = 0;
        int ycount = 0;
        
        for (int i = 0; i < s.length(); i ++) {
        	if (s.charAt(i) == 'p' || s.charAt(i) == 'P') {
            	pcount ++;
            }
            if (s.charAt(i) == 'y' || s.charAt(i) == 'Y') {
            	ycount ++;
            }
        }
        
        if (pcount == ycount) {
        	return true;
        }
        else {
        	return false;
        }
   }
}

위 풀이의 핵심은 다음과 같습니다.
1) int pcount = 0; int ycount = 0;
2) if (s.charAt(i) == 'p' || s.charAt(i) == 'P') { pcount ++; }
3) if (pcount == ycount) { return true; }

원문은 다음과 같습니다.


자바로 코드를 작성하다보면, '내가 불필요하게 조건문에 {}를 많이 사용하나?'라는 생각이 들더군요.

궁금해서 재미로 chatGPT한테 물어봤더니 답변은 다음과 같았습니다.

if 조건문의 내용이 길지 않을 경우

중첩 for문과 if 조건문으로 인해 중괄호의 개수가 너무 많아졌을 경우

요약하자면, 되도록이면 중괄호를 작성하되 코드의 깊이를 줄일 수 있는 방법을 사용하면 좋다는 결론을 얻었습니다.

앞으로도 제 코드에는 중괄호가 대부분 존재할 것 같네요 🙆‍♀️


p.s 코딩 테스트에서도 가독성이 중요할까?

그렇다고 하네요 🍰

profile
B - B = 이은비

0개의 댓글