1. 문자열 나누기
문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
나의 풀이
def solution(s):
cnt = 0
cntd = 0
result = 1
x = s[0]
for i in s:
if cnt != 0 and cnt == cntd:
result += 1
x = i
if x == i:
cnt += 1
else:
cntd += 1
return result
비교대상을 x로 둔다. x는 우선 문자열 s의 0번째 문자로 지정한다.
cnt는 x와 비교하였을때 동일한 문자일 경우의 개수를 셀 변수이고,
cntd는 x와 비교하였을때 다른 문자일 경우의 개수를 셀 변수이다.
for문을 통해 s문자열에서 한 문자씩 i로 지정하여준다.
맨 처음에 cnt 와 cntd가 같은지 확인한다.
cnt와 cntd 모두 0으로 처음 설정되어있기때문에 cnt!=0 조건을 추가한다
같으면 result에 1을 더하고 x를 i로 변경한다.
분할 한 경우의 수 result에 1개를 더한 뒤 분할한 뒤의 첫 문자 i를 x로 변경하여주는 것이다.
그 뒤에 if문을 사용하여 x와 i를 비교하여 같으면 cnt , 다르면 cntd를 1씩 더해준다.
마지막으로 결과로 result를 return하면 된다.
이때 마지막 문자까지 for문이 돌고 나서는 cnt와 cntd가 동일한지 확인이 불가하고
동일하지 않더라도 한 문자 그 자체로 분할이되기때문에 result에 미리 1을 추가해서 지정하였다.
다른사람 풀이 + 개선점
def solution(s):
answer = 0
sav1=0
sav2=0
for i in s:
if sav1==sav2:
answer+=1
a=i
if i==a:
sav1+=1
else:
sav2+=1
return answer
나의 경우에는 cnt와 cntd가 0이 되어 같으면 result에 1이 추가되기 때문에 이를 방지하는 조건문을 추가하고
마지막 분할의 경우가 더해지지 않기때문에 result에 1을 미리 지정해놨었는데
그렇게 할 필요없이 그냥 1이 더해지게 위 코드처럼 작성할 수 있다.
2. JadenCase 문자열 만들기
문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요
나의 풀이
def solution(s):
s = s.lower()
cnt = s.count(" ")
index1 = -1
if s.find(' ',-1) == len(s)-1:
cnt-=2
while cnt >= 0:
index = s.find(" ",index1+1)
if len(s)-2 > index and s[index+1] !=" ":
s = s[:index+1] + s[index+1].upper() + s[index+2:]
index1 = index
cnt -= 1
else:
cnt -= 1
return s
테스트 케이스는 통과했으나 코드 채점결과 실패한 코드이다.
반례를 찾아보니 (" for the what 1what ") 과 같이 앞 뒤에 공백이 있을때
공백의 처리가 이루어지지 않는다는 문제가 있었다.
def solution(s):
list = []
for i in s.split():
if i[0].isalpha():
i = i[0].upper() + i[1:].lower()
else:
i = i.lower()
list.append(i)
answer = ' '.join(list)
return answer
isalpha 와 split을 사용하여 코드를 조금 더 간결하게 만들었지만 또한 채점결과 실패로 나왔다.
위와 같은 반례를 해결하지 못하였다.
def solution(s):
list = []
for i in s.split(" "):
if i == "":
print("s")
list.append(i)
elif i[0].isalpha():
i = i[0].upper() + i[1:].lower()
list.append(i)
else:
i = i.lower()
list.append(i)
answer = ' '.join(list)
return answer
반례를 해결한 코드이다.
split 할때 공백으로 나누면 공백도 포함되어 i로 하나씩 지정된다.
따라서 공백일때 >> i == "" list에 append해주고 그 외에는 위와 동일하게
앞이 알파벳이면 맨 앞만 대문자로 나머지는 소문자로 변경해주고
알파벳이 아니면 그대로 모든 문자를 소문자로 변경한 뒤 list에 담아
마지막에 join을 통해 문자열로 만들어주는 방식이다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스] Python Lv.1 가장 많이 받은 선물 (1) | 2024.01.08 |
---|---|
[프로그래머스] MySQL Lv.3 헤비유저가 소유한 장소 / Lv.4 주문량이 많은 아이스크림들 조회하기 (1) | 2024.01.07 |
[프로그래머스] MySQL Lv.2 고양이와 개는 몇 마리 있을까 / Lv.5 상품을 구매한 회원 비율 구하기 (0) | 2024.01.05 |
[프로그래머스] Python Lv.1 완주하지 못한 선수 (1) | 2024.01.03 |
프로그래머스 Python Lv.0 평행 / 겹치는 선분의 길이 (3) | 2023.12.20 |