[프로그래머스] JadenCaes 문자열 만들기

hyun·2021년 11월 3일
0

알고리즘 문제

목록 보기
3/10
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/12951

문제 이해

비교적 간단해 보이는 문자열 문제이다. 주어진 문자열의 첫 글자를 대문자로 변환해주면 된다.

접근

  1. split함수를 사용해 띄어쓰기로 나뉘어진 문자열을 분리하고,
  2. 분리된 문자열 덩어리의 0번 인덱스에 upper함수를, 1번부터 끝까지는 lower함수를 씌워준다.
  3. 0번과 1~나머지 인덱스를 합쳐서 리턴한다.

풀이

나의 시도 1

def solution(s):
    s = s.split()
    answer = []
    for word in s:
        if word[0].isalpha():
            word = word[0].upper() + word[1:].lower()
        answer.append(word)
    return ' '.join(answer)

처음 생각했던 접근방법을 그대로 구현했다. 테스트케이스 2개는 통과했지만, 제출 시 정확성 테스트가 43점으로 절반 이상 통과되지 못했다.

나의 시도 2

뭐가 문제일까 고민하다가, 다른 분이 올려둔 글을 보니 split()split(" ")이 다르게 작동한다는 것을 알게 되었다(충격!).

예를 들면,

string = "word1 word2  word3   word4    "

print(string.split())
> ['word1', 'word2', 'word3', 'word4']

print(string.split(" "))
> ['word1', 'word2', '', 'word3', '', '', 'word4', '', '', '', '']

# 출처: https://somjang.tistory.com/entry/Python-문자열-split-과-split-차이-알아보기

split( )은 공백의 수에 상관없이 무조건 1개로 보고 처리
split(" ")은 공백 1개, 1개를 각각의 공백으로 따로따로 처리한다고 한다.
추가적으로 split( )은 공백만 처리하는 것이 아니라 "\t" (탭), "\n" (엔터) 도 처리해준단다.

def solution(s):
    s = s.split(" ")
    for i in range(len(s)):
        s[i] = s[i][:1].upper() + s[i][1:].lower()
    return ' '.join(s)

split()split(" ")으로 바꾸고, for문 안에서 불필요한 작업을 없앴다. 결과는 잘 통과한다. 같은 코드에서 split()으로 바꾸고 제출하면 통과가 안된다.

다른 사람의 풀이

def solution(s):
    answer = ''
    s=s.split(' ')
    for i in range(len(s)):
        # capitalize 내장함수를 사용하면 첫 문자가 알파벳일 경우 대문자로 만들고
        # 두번째 문자부터는 자동으로 소문자로 만든다.
        # 첫 문자가 알파벳이 아니면 그대로 리턴한다.
        s[i]=s[i].capitalize()
    answer=' '.join(s)
    return answer
    
# 출처: https://velog.io/@jiffydev/파이썬-알고리즘-110-프로그래머스-JadenCase-문자열-만들기

세상 간단하다.

배운 것

  • capitalize() 함수처럼 시간 단축에 유용한 내장함수들을 많이 알아두자.
  • string은 immutable하다. 값을 변경하려면 replace()를 사용하거나 리스트로 변환해서 변경하고 다시 스트링으로 변환해야 한다.
  • split()split(" ")의 차이, 기억하자. 띄어쓰기가 여러 개 있는 케이스를 생각하지 못한 것이 시도 1의 실패 원인이었다.
  • 간단해 보이는 문제도 바로바로 풀어내지 못한다. 이 정도의 문제는 순식간에 풀어낼 수 있도록 연습하자!
profile
프론트엔드를 공부하고 있습니다.

0개의 댓글