본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[프로그래머스 1단계] 문자열 다루기 기본 문제 설명 및 풀이

 

말그대로 쉬운 

문자열 기초 문제입니다.

Level 1 - 문자열 다루기 기본

문제

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 작성하시오.

예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

풀이

매우매우 간단해요. 모든 문자열은 아스키코드로 해석되는거 아시죠?!

1. 문자열 길이 체크

2. 숫자만 있는지 체크

그냥 문제에 나와있는 조건만 확인해주시면 끝입니다.

 

[C ++]

문자열을 다루는 문제인만큼 문자열 관련 포스팅을 보고 오면 실력을 쌓는데 도움이 됩니다.

1. string 라이브러리 사용법 1탄 포스팅

2. string 라이브러리 총 정리 2탄

#include <string>
#include <iostream>
using namespace std;

bool solution(string s) {
    bool answer = true;
    if (s.length() != 4 && s.length() != 6)
        answer = false;
    else {
        for (int i = 0; i < s.length(); i++)
        {
            if (!(s.at(i) >= '0' && s.at(i) <= '9'))
            {
                answer = false;
                break;
            }
        }
    }
    return answer;
}

[C++]

두 번째! cctype 헤더에는 문자들을 구분해주는 함수들이 정리되어 있답니다.

아마 제 포스팅을 꾸준하게 봤던 분이라면(?) 백준 알고리즘 문자열 문제 풀이에서 공백인지 판별해주는 isspace함수를 사용했던 걸 본적 있으실거예요

이번에는 cctype 헤더의 isdigit() 문자그대로 숫자인지 판별해주는 함수를 이용해서 풀어볼게요

#include <string>
#include <cctype>
#include <iostream>
using namespace std;

bool solution(string s) {
    bool answer = true;
    if (s.length() != 4 && s.length() != 6)
        answer = false;
    else {
        for (int i = 0; i < s.length(); i++)
        {
            if (!isdigit(s[i))
            {
                answer = false;
                break;
            }
        }
    }
    return answer;
}

저렇게 if else로 판별을 먼저 해주고 마지막에 값을 return할 수도 있지만

else 의 부가적인 블럭처리가 별로 안이쁘다면 9번라인을 return false; 로 변경해 바로 종료할 수 있습니다.

 

[Java]

자바 언어도 똑같은 로직으로 해결할 수 있어요. C언어의 at()함수와 Java의 charAt()함수는 같은 기능을 한다는거 알고 있죠? else부문을 없애주기 위해 if비교문을 대우인 s.length()==4 || s.length()==6 로 바꿔 적용해봤어요. 코드가 좀 더 간결해졌네요 ㅎㅎ

class Solution{
    public boolean solution(String s){
        if(s.length() == 4 || s.length() == 6){
            for( int i=0; i<length; i++){
                if(s.charAt(i) >= '0' && s.charAt(i) <='9')
                    return true; 
            }
        }
        return false;
    }
}

C의 isdigits()함수 대신에 자바에서는 Character.isDigit()을 사용할 수 있습니다. 로직이 똑같으니까 두번째꺼는 생략하고 이번에는 다른 방식으로 문제를 풀이해볼게요 

 

[Java]

이렇게 푸신 분들도 많으실 것 같은데 정규 표현식으로 문자열을 검증해주는 방법이 있습니다. ㅎㅎ 정규표현식은 처음에 어려워하는 부분중에 하나인데 유용하므로 꼭 익혀둬야해요. C에서 또한 똑같이 적용할 수 있습니다.

class Solution {
 public boolean solution(String s) {
        if(s.length()==4||s.length()==6) {
            return s.matches("^[0-9]*$");
        }
        return false;
    }    
}

문자열이 숫자로만 이루어져있어야 하니까 

^: 시작

[0-9]: 숫자로만

*$: 0개이상의 글자로 끝남.

근데 앞에 조건문으로 4길이 또는 6길이만 들어오도록 걸어놨으니 길이가 4 혹은 6이면서 숫자인 문자열들만 받을거예요. ㅎㅎ 일치하면 1을 리턴합니다.