세조목

PYTHON 정리(프로그래머스 - 문자열 다루기 기본)(feat. 내가 희열을 느낄때)(24.01.20) 본문

데이터 분석 공부/Python

PYTHON 정리(프로그래머스 - 문자열 다루기 기본)(feat. 내가 희열을 느낄때)(24.01.20)

세조목 2024. 1. 20. 21:39

파이썬 예제를 풀었다.

지금까지 제가 작성한 예제 답안 중에서 가장 길이가 길었다.

문제를 다 풀고나서는 마치 자격증 시험에 통과했을때의 성취감(보다는 덜하지만)같은 성취감을 느꼈다.

 

예제를 풀때마다 느끼는거지만

보통 세번의 희열을 느낀다.

 

그 세번은

  1. 문제를 보고서 이 문제를 어떻게 풀어야겠다는 구조가 머릿속에 그려질때
  2. 그 구조대로 코드를 작성했을때
  3. 각각의 구조가 완성된 후 하나의 톱니바퀴가 되어 서로 맞물려 돌아갈때 

이다.

 

마치 인테리어를 할 때

  1. 도면을 그리고
  2. 도면에 맞춰서 각 방마다 시공을 하고
  3. 인테리어가 완성

되는것과 유사하지 않을까 생각했다.

 

각설하고 오늘 풀었던 예제는 아래 예제다.

https://school.programmers.co.kr/learn/courses/30/lessons/12918

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제에서 요구하는건 간단하다.

조건에 맞으면 True

조건에 맞지 않으면 False

를 반환하는건데

조건은 아래와같다.

  1. 문자열의 길이가 4 또는 6
  2. 문자열은 숫자로만 구성되어있어야함

 

1. 구조 잡기

이 예제를 풀기 위해 가장 먼저 1번 조건의 구조를 잡아봤다.

def solution(s):
	if len(s) = 4:
	elif len(s) = 6:
    else:
    	return False

문자열의 길이가 4 or 6이면 그 다음 단계로 넘어가고

그렇지 않으면 False를 반환한다.

 

자 이제 2번 조건의 구조를 한번 잡아보자.

 

▶ 1단계

2번 조건은 문자열에 영문 알파벳이 포함되어있다면 False를 반환하라는 조건이다.

문자열에 영문 알파벳이 포함되어있는지 없는지를 판별하는게 관건인데

어떻게 판별할 수 있을까?

나는 문자열을 인덱싱해서 각각의 값이 0부터 9사이에 있다면

answer라는 이름의 변수에 넣고

그렇지 않으면 pass하게끔 했다.

 

▶ 2단계

문자열이 모두 숫자로 구성되었다면

answer 리스트에 문자열의 모든 값들이 들어갔을 것이므로

answer의 길이와 문자열의 길이가 같게된다.

그 때는 True를, 그렇지 않을 때는 False를 반환하면 된다.

 

2. 구조에 맞춰 코드 작성하기

1번 조건의 경우 구조 잡기와 코드 작성이 동시에 이루어졌기때문에 pass하고

2번 조건의 구조에 맞춰서 코드를 한번 작성해보자

answer = []
for i in range(len(s)):
	val = s[i]
    for j in range(0,10):
    	if val == str(j):
        	answer.append(val)
        else:
        	pass
if len(answer) == len(s):
	return True
else:
	return False

 

이렇게 하면 앞서 언급했던대로

문자열에 영문 알파벳이 포함되어있을경우 False를

그렇지 않을 경우 True를 반환하게된다.

더보기

여기서 주의해야할 점이 있는데

if val == str(j):

이 부분을 보면 j를 str로 감싸고 있는 것을 확인할 수 있다.

왜 str로 감쌌을까?

val이라는 변수는 문자열 s를 인덱싱한 값을 가리키고있다.

문자열 s를 인덱싱한 값은 숫자가 아닌 문자이기때문에

j와 비교하려면 str로 감싸줘야하는 것이다.

 

'그럼 인덱싱한 값을 int로 둘러싸도 되는거 아니야?'

라는 궁금증이 생길수도 있다.

결론부터 얘기하면 그렇게는 할 수 없다.

인덱싱한 값을 int로 둘러싸게되면

숫자기때문에 j와 비교할수는 있겠지만

만약 인덱싱한 값이 숫자가 아닌 문자면 어떻게 할 것인가?

int(a) 또는 int(c)가 가능할까?

invalid syntax다.

따라서 인덱싱한 값을 int로 둘러싸는 것이 아니라

j를 str로 둘러싸는 것이다.

이렇게 2번 조건의 구조에따라 작성한 코드를

1번 조건의 구조에따라 작성한 코드에 끼워 넣어주기만 하면 된다.

1번 조건의 구조에따라 작성한 코드를 보면

True를 반환하는 조건은 if와 elif에 해당하는 코드들이기 때문에

if와 elif에 2번 조건의 구조에따라 작성한 코드를 넣어주면 되는 것이다.

 

3. 결합

그렇게 했을때의 코드는 아래와 같다.

def solution(s):
    answer = []
    if len(s) == 4:
        for i in range(len(s)):
            for j in range(0,10):
                val = s[i]
                if val == str(j):
                    answer.append(val)
                else:
                    pass
        if len(answer) == len(s):
            return True
        else:
            return False
    elif len(s) == 6:
        for i in range(len(s)):
            for j in range(0,10):
                val = s[i]
                if val == str(j):
                    answer.append(val)
                else:
                    pass
        if len(answer) == len(s):
            return True
        else:
            return False
    else:
        return False

 


 

이 예제에서 출제자가 말하고싶었던건

'python의 문자열에 대해서 잘 알고있는가'

이지 않았을까싶다.

예제의 제목도 '문자열 다루기 기본'이라고 적혀있고말이다.

이 예제에서 다루는 문자열의 기본은

  1. 문자와 숫자는 비교할 수 없다.
  2. 내가 비교하고자하는 값이 숫자인지 문자인지 확실하게 구분하자

정도이지 않을까?