Code Wars 25: Reverse or rotate

김기욱·2022년 7월 4일
0

코딩테스트

목록 보기
68/68

문제설명

The input is a string str of digits. Cut the string into chunks (a chunk here is a substring of the initial string) of size sz (ignore the last chunk if its size is less than sz).

If a chunk represents an integer such as the sum of the cubes of its digits is divisible by 2, reverse that chunk; otherwise rotate it to the left by one position. Put together these modified chunks and return the result as a string.

요약
주어진 문자열을 sz길이로 자름. 잘려진 각각의 덩어리들의 숫자들의 세제곱의 합이 짝수일 경우에는 뒤집힌 문자열을, 홀수일 경우에는 왼쪽으로 한 칸 돌린 문자열(예시참조)을 반환하고 각각의 수정된 문자열 덩어리들을 합친값을 반환함

제한사항

sz is <= 0 or if str is empty return ""
sz is greater (>) than the length of str it is impossible to take a chunk of size sz hence return "".

'sz'나 'str'값이 빈 값일 경우에는 공백을 return
'sz'가 문자열이나 문자열덩어리보다 큰 경우에도 공백으로 return 혹은 치환

입출력 예시

revrot("123456987654", 6) --> "234561876549"
revrot("123456987653", 6) --> "234561356789"
revrot("66443875", 4) --> "44668753"
revrot("66443875", 8) --> "64438756"
revrot("664438769", 8) --> "67834466"
revrot("123456779", 8) --> "23456771"
revrot("", 8) --> ""
revrot("123456779", 0) --> "" 
revrot("563000655734469485", 4) --> "0365065073456944"

'''
Example of a string rotated to the left by one position:
s = "123456" gives "234561".
'''

풀이

def rev_rot(s, sz):
    result = ''
    if sz > len(s) or sz <= 0 or len(s) <= 0:
        return '' 
    for v in [s[i:i+sz] for i in range(0,len(s),sz)]:
        if len(v) >= sz:
            if sum([int(n)**3 for n in v]) % 2 == 0:
                result += v[::-1]
            else: 
                result += (v[1:]+v[0])
    return result
  1. 공백으로 반환하는 경우를 분기처리해서 return
  2. 주어진 sz길이만큼 문자열덩어리들을 담은 리스트를 만들어주고 for loop로 각각의 문자열 덩어리들을 reverse시킬지 rotate시킬지 결정함
  3. 각각의 숫자들의 세제곱의합이 짝수일 경우 리버스, 아니면 로테이트 시킴
    (ex 123의 경우 1 + 8 + 27 = 36으로 짝수임 reverse)
  4. 합산한 값을 return
  5. 알고리즘 작성보다 문제해석이 더 오래거린 문제였으며(특히 세제곱 부분), 실제 외국인들도 문제해석이 더 힘들다고 성토한 글이 꽤나 있었습니다.
profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글