문자열 code가 주어집니다.
code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.
mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.
mode가 0일 때
code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.
mode가 1일 때
code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.
code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.
문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
입출력 예시
code result
"abc1abc1abc" "acbac"
입출력 설명
입출력 예
i code[i] mode ret
0 "a" 0 "a"
1 "b" 0 "a"
2 "c" 0 "ac"
3 "1" 1 "ac"
4 "a" 1 "ac"
5 "b" 1 "acb"
6 "c" 1 "acb"
7 "1" 0 "acb"
8 "a" 0 "acba"
9 "b" 0 "acba"
10 "c" 0 "acbac"
따라서 "acbac"를 return 합니다.
mode가 1/0 으로 code[i]를 ret으로 부분적으로 준다는 글을 길게 썼다.
1. mode를 초기화 시켜준다.
2. ret를 초기화 시켜준다.
3. 코드 순회
(1) if code[i]안에 있는 문자가 1이면
(2) mode change (1 ➡️ 0)
(3) if code[i]안이 문자이면
(4) if mode ==1 이면서 idx %2 ==0 (짝수일 경우)
(5) ret에 char 추가하기
(6) if mode ==1 이면서 idx % 2 ==1 (홀수일 경우)
(7) ret에 char 추가하기
(8) 결과 문자열이 비어있으면 "EMPTY" 반환
def solution(code):
mode = 0 # 시작 모드는 0
ret = "" # 결과 문자열 초기화
for idx, char in enumerate(code):
# enumerate == 인덱스와 원소를 동시 접근 가능
if char == "1": # 글 자체에 숫자가 있을 경우
mode = 1 - mode # 0으로 바꿔줘야 하니까
else:
# 모드 0에서는 idx가 짝수일 때만 추가
if mode == 0 and idx % 2 == 0:
ret += char
# 모드 1에서는 idx가 홀수일 때만 추가
elif mode == 1 and idx % 2 == 1:
ret += char
# 결과 문자열이 비어있으면 "EMPTY" 반환
return ret if ret else "EMPTY"
solution(code):
return "".join(code.split("1"))[::2] or "EMPTY"
# split("1") ➡️ "1"를 기준으로 분리 ["abc", "abc", "abc"]
# "".join() ➡️ 리스트의 요소들을 문자열로 합침 "abcabcabc"
# [::2] ➡️ 문자열의 시작부터 끝까지 각각 두칸씩 건너뛰며 추출(짝수 인덱스) "a", "c", "b", "a", "c"
우와 코드를 이렇게까지 줄릴 수 있다니...
오늘도 하나 배우고 갑니다...