박종훈 알고리즘 블로그

문자열에 들어 있는 모든 공백을 '%20'으로 바꿔 주는 메소드를 작성하라.

URL화: 문자열에 들어 있는 모든 공백을 '%20'으로 바꿔 주는 메소드를 작성하라. 최종적으로 모든 문자를 다 담을 수 있을 만큼 충분한 공간이 이미 확보되어 있으며 문자열의 최종 길이가 함께 주어진다고 가정해도 된다 (자바로 구현한다면 배열 안에서 작업할 수 있도록 문자 배열(character array)을 이용하길 바란다).

URL 인코딩에 대해 궁금하다면 https://en.wikipedia.org/wiki/URL_encoding 을 참고하자.
한국어 위키에는 퍼센트 인코딩 이라고 되어있다.

file


이 문제를 해결하는 가장 쉬운 방법은 replace를 하는것 이겠지만, 그 것을 묻는 것은 아닐 것이다.
이 문제는

  • 문자로 구성된 배열(character array)을 이용해 문제를 풀기를 원했고
  • 최종적으로 모든 문자를 다 담을 수 있을 만큼 충분한 공간이 이미 확보되어 있다고 가정을 하였다.

따라서 아래와 같이 풀 수 있다.

def urlify(input_str, input_length):
    char_array = list(input_str)
    space_count = char_array.count(' ')
    new_length = input_length + 2 * space_count

    # 문자 배열의 크기를 초과하지 않도록 조정
    char_array.extend([''] * (2 * space_count))

    for i in range(input_length - 1, -1, -1):
        if char_array[i] == ' ':
            char_array[new_length - 1] = '0'
            char_array[new_length - 2] = '2'
            char_array[new_length - 3] = '%'
            new_length -= 3
        else:
            char_array[new_length - 1] = char_array[i]
            new_length -= 1

    return ''.join(char_array)

# 테스트
input_str = "Mr John Smith"
input_length = 13
output = urlify(input_str, input_length)
print(output)  # 출력: "Mr%20John%20Smith"

range()

Python 내장 함수 range()의 인자는 세 개의 값으로 구성되어 있습니다:
(start, stop, step).

start: 시작 값입니다. true_length - 1로 설정하여 문자열의 실제 길이에서 1을 빼서 시작합니다.
stop: 종료 값입니다. -1로 설정하여 0까지 역순으로 반복합니다.
step: 각 단계의 크기입니다. -1로 설정하여 역순으로 반복합니다.

python array extend() 메소드

리스트를 배열 맨뒤에 붙입니다. 파라미터는 리스트만 허용.

python array 에 number를 곱하면

그 횟수만큼 concat이 된다.

print(['1', '2'] * 3) # 출력: "['1', '2', '1', '2', '1', '2']"