[프로그래머스] LV0. 코드 처리하기

윤인경·2023년 8월 3일
0

코딩테스트

목록 보기
23/38
post-thumbnail

문제 설명

문자열 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 합니다.

제한사항

  • 1 ≤ code의 길이 ≤ 100,000
    - code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.

입출력 예

coderesult
"abc1abc1abc""acbac"

입출력 예 설명
입출력 예 #1
code의 각 인덱스 i에 따라 다음과 같이 moderet가 변합니다.

icode[i]moderet
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"
    1. code.split("1") - "1"을 기준으로 code를 분할한다.
    1. code.split("1")[::2] - 2개 띄워서 인덱싱
    1. "".join(code.split("1"))[::2] - code를 "1" 기준으로 분할한 것을 2개 간격으로 인덱싱하고 빈공간 없이 join으로 합친다.
    1. 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'
    1. 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 연산)
    1. mode와 i % 2가 동일하면 0일땐 짝수, 1일땐 홀수로 하나의 코드로 두 조건 모두 만족하게되는 코드가 나오게 된다.
    1. return answer if answer else 'EMPTY'
      answer이 채워져 있을 때 answer을 반환한다. 비어있으면 'EMPTY'를 반환한다.
      if 문을 1줄로 작성하는 방법이다.
      참일때 실행 if 조건 else 거짓일때 실행
profile
코딩 공부 및 프로젝트 정리

0개의 댓글