ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 1단계] 알고리즘 6. 같은 숫자는 싫어!
    레거시/레거시-알고리즘(3) 2018. 2. 21. 23:35
    반응형

    문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)


    알고리즘 6. 같은 숫자는 싫어!

    입력된 문자열(숫자인)을 순서를 유지하면서 글자들 중 연속적으로 나타나는 아이템은 제거된 배열을 리턴하도록 함수를 완성하라


    ex) s = '133303' -> ['1', '3', '0', '3']

         s = '47330'  -> ['4', '7', '3', '0']

         s = ''          -> []


    def no_continuous(s):
    # 함수를 완성하세요
    return []

    # 아래는 테스트로 출력해 보기 위한 코드입니다.
    print( no_continuous( "133303" ))


    풀이:

    처음에는 문자열을 숫자로 바꾼 후, 1의 자리수부터 차근 차근 올라가면서 나머지를 리스트의 첫 요소와 비교후에 다른 수라면 리스트의 첫 요소로 추가하는 방식을 선택했다. 이를 파이썬 코드로 나타내면 다음과 같다.


    def no_continuous_int(s):
    # 함수를 완성하세요
    n = int(s) #문자열 -> 숫자
    i = 10 #각 자릿수를 확인하기위한 수 10
    l = [n % i] #먼저 1의 자릿수를 리스트의 입력
    n //= i #이제 1의 자릿수에 대한 검사가 끝났으니 다음 자릿수인 십의 자릿수 확인
    while(n != 0):
    c = n % i #검사할 자릿수의 숫자
    n //= i #다음 자릿수로 옮김
    if(c != l[0]): #만약 리스트의 첫 요소와 다른 수가 들어간다면
    l.insert(0, c) #리스트의 첫 요소를 삽입
    return l


    주석을 보면 쉽게 확인 할 수 있을 것이다. 여기서 while 위에 같은 작업을 반복하는 것은 파이썬에서는 do~while 문법을 지원하지 않기 때문에 코드를 반복하였다. 그러나 이렇게 했을 때 문자열이 숫자가 아니라면 이 코드는 무조건 실패하는 코드가 된다. 그래서 곰곰히 생각해 본 후 다시 생각한 풀이의 핵심은 다음과 같다.


    "문자열을 있는 그대로 이용하자!"


    무슨 말이냐면 파이썬을 일련의 배열로 봐서 순서대로 검사를 해보자는 것이다. 코드로 보면 명확하게 내가 말하는게 무슨 뜻인지 알 수 있을 것이다.


    def no_continuous(s):
    # 함수를 완성하세요
    return [ s[i] for i in range(len(s)) if (i ==0) or (s[i] != s[i-1]) ]


    이 코드 역시 for 컴프리헨션을 이용하였다. 중요한 점은 컴프리헨션은 문자열의 요소를 반환해야하기 때문에 s[i] 를 명시해 주었다. 이제 문자열의 길이만큼 돌면서 


    (i == 0) or (s[i] != s[i-1]) 


    즉 첫 요소 혹은 이전의 요소와 다른 요소일 경우에만 반환 시켰다. 파이썬 역시 or 연산시에 첫 조건이 true 이면 다음 조건을 검사하지 않는다. 뭐 파이썬은 리스트 인덱스로 - 를 지원하기 때문에 다른 언어처럼 ArrayIndexException은 나오지 않겠지만 알고리즘과 다른 수가 나올 수도 있다. 그래서 or 연산자를 통해 확실하게 이를 배제하였다. 확실히 파이썬의 코드들은 만들면서도 감탄을 자아내게 하는 무언가가 있다. 다음은 코드 전문이다.


    def no_continuous_int(s):
    # 함수를 완성하세요
    n = int(s) #문자열 -> 숫자
    i = 10 #각 자릿수를 확인하기위한 수 10
    l = [n % i] #먼저 1의 자릿수를 리스트의 입력
    n //= i #이제 1의 자릿수에 대한 검사가 끝났으니 다음 자릿수인 십의 자릿수 확인
    while(n != 0):
    c = n % i #검사할 자릿수의 숫자
    n //= i #다음 자릿수로 옮김
    if(c != l[0]): #만약 리스트의 첫 요소와 다른 수가 들어간다면
    l.insert(0, c) #리스트의 첫 요소를 삽입
    return l


    def no_continuous(s):
    # 함수를 완성하세요
    return [ s[i] for i in range(len(s)) if (i ==0) or (s[i] != s[i-1]) ]

    # 아래는 테스트로 출력해 보기 위한 코드입니다.
    print( no_continuous( "133303" ))


Designed by Tistory.