01. 배열과 문자열
문제 1.3
URL화 : 문자열에 들어 있는 모든 공백을 '%20'으로 바꿔 주는 메서드를 작성하라. 최종적으로 모든 문자를 다 담을 수 있을 만큼 충분한 공간이 이미 확보되어 있으며 문자열의 최종 길이가 함께 주어진다고 가정해도 된다.
풀어보기
1. 문자열 순회하면서 이어붙이기
단순하게 문자열을 하나씩 확인하며 공백일 때는 '%20', 공백이 아닐 때는 기존 문자열을 덧붙여서 새로운 결과 문자열을 만들어 리턴한다.
# 1.3 URL화
s = "Mr John Smith"
def toURL(str):
newS = ""
for x in s:
if x == ' ':
newS += "%20"
else:
newS += x
return newS
print(toURL(s))
# -결과----------------------------------------------------------------------------------
# Mr%20John%20Smith
수정된 풀이(하나의 문자열로 편집하여 리턴)
# 1.3 URL화
s = "Mr John Smith"
def toURL(str):
n = len(str)
# 마지막 부터 첫번째까지 순회
for i in range(len(str)-1, 0-1, -1):
if str[i] == ' ':
str = str[:i] + "%20" + str[i+1:]
return str
print(toURL(s))
# -결과----------------------------------------------------------------------------------
# Mr%20John%20Smith
해답
문제에 정확히 나오지 않았지만 주의해야할 사항은 이 문제는 새로운 문자열을 만들어 변환 하는 것이 아니라, 기존의 문자열을 가지고 조작하여 풀어야 하는 문제!
따라서 문자열을 앞에서 부터 편집하는 것이 아니라, 뒤에서 부터 편집한다. 앞에서 부터 편집하면 아직 편집해야 할 문자가 덮어쓰여질 우려가 있기 때문이다.
1. 공백의 갯수를 세고, 문자열을 뒤에서부터 거꾸로 편집하며 복사해나간다.
void replaceSpaces(char [] str, int trueLength){ // truelength는 주어진 문자열의 길이
int spaceCount = 0, index, i = 0;
for (i = 0; i < trueLength; i++){
if (srt[i] == ' '){
spaceCount++; // 공백의 숫자를 센다
}
}
index = trueLength + spaceCount * 2; // 문자열의 길이에다가 URL화로 인해 치환될 문자열의 길이를 더한 값이 index
if (trueLength < str.length){ // 만약 주어진 문자열의 길이가 실제 문자열의 길이보다 작다면 중간에 종료
str[trueLength] = '\0'
}
// str[trueLength] -> str[index] 로 문자열 복사
for (i = trueLength - 1; i>=0; i--){
if (str[i] == ' '){
str[index - 1] == '0';
str[index - 2] == '2';
str[index - 3] == '%';
index = index-3;
}
else{
str[index - 1] = str[i];
Index--;
}
}
}
'개발자의 기본기 > 기술면접 문제' 카테고리의 다른 글
코딩인터뷰 완전분석 - 1.5 하나 빼기 (0) | 2021.08.29 |
---|---|
코딩인터뷰 완전분석 - 1.4 회문 순열 (0) | 2021.08.26 |
코딩인터뷰 완전분석 - 1.2 순열 확인 (0) | 2021.08.19 |
코딩인터뷰 완전분석 - 1.1 중복이 없는가 (0) | 2021.08.09 |