문자열 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" |
입출력 예 설명
입출력 예 #1
code
의 각 인덱스 i에 따라 다음과 같이 mode
와 ret
가 변합니다.
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 합니다.
def solution(code): ret = "" mode = 0 for i in range(len(code)): if code[i] == "1": if mode == 0: mode = 1 else: mode = 0 elif mode == 0: if i % 2 == 0: ret = ret+code[i] else: if i % 2 == 1: ret = ret+code[i] if ret == "": ret = "EMPTY" return ret
코드 간단 소개
- return 할 무자열을 담을 ret을 빈 문자열로 선언한다.
- mode는 처음 시작시에 0이다.
- for문을 code의 길이 만큼 돌면서 실행한다. range(len(code))
- code[i]가 "1"이면 mode를 전환한다.
- 0 -> 1, 1 -> 0
- code[i]가 "1"이 아니고 mode가 0이면
- i % 2 == 0 으로 인덱스가 짝수인지 확인한다.
- 짝수이면 ret = ret+code[i]로 ret에 code[i]문자를 추가하여 문자열을 만든다.
- code[i]가 "1"이 아니고 mode가 1이면
- i % 2 == 1로 인덱스가 홀수인지 확인한다.
- 홀수이면 ret = ret+code[i]로 ret에 code[i]문자를 추가하여 문자열을 만든다.
- for문을 모두 빠져 나왔는데도 ret이 빈 문자열이면
- ret = "EMPTY"를 한다.
- ret을 return한다.
def solution(code): return "".join(code.split("1"))[::2] or "EMPTY"
- code.split("1") - "1"을 기준으로 code를 분할한다.
- code.split("1")[::2] - 2개 띄워서 인덱싱
- "".join(code.split("1"))[::2] - code를 "1" 기준으로 분할한 것을 2개 간격으로 인덱싱하고 빈공간 없이 join으로 합친다.
- return "".join(code.split("1"))[::2] or "EMPTY" - "".join(code.split("1"))[::2]이게 안되면 "EMPTY"를 return한다.
def solution(code): answer = '' mode = 0 for i in range(len(code)): if code[i] == '1': mode ^= 1 else: if i % 2 == mode: answer += code[i] return answer if answer else 'EMPTY'
- if code[i] == '1': mode ^= 1 - code[i] == '1'일때 mode ^= 1
- 여기에서 ^는 비트 연산자이다. 비트 연산자를 정리해보자
비트 연산자 설명 & 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산) \ 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산) ^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산) ~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산) << 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산) >> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)
- mode와 i % 2가 동일하면 0일땐 짝수, 1일땐 홀수로 하나의 코드로 두 조건 모두 만족하게되는 코드가 나오게 된다.
- return answer if answer else 'EMPTY'
answer이 채워져 있을 때 answer을 반환한다. 비어있으면 'EMPTY'를 반환한다.
if 문을 1줄로 작성하는 방법이다.
참일때 실행 if 조건 else 거짓일때 실행