let info = "JavaScript는 프로그래밍 언어이다.";
위의 설명에 "프로그래밍" 이라는 단어가 포함 됐는지 알고 싶습니다.
indexOf 메소드는 문자열에 특정 문자열이 들어있는지 확인하고,
만약 있다면 몇번 째 순서에 해당 문자열이 있는지 알려 줍니다.
해당 문자열이 없다면 -1을 반환합니다.
let info = "JavaScript는 프로래밍 언어이다.";
let firstChar = info.indexOf("프로래밍");
console.log(info, firstChar);
if (firstChar !== -1) {
info = info.slice(0, firstChar) + "프로그래밍" + info.slice(firstChar+4, info.length);
}
console.log(info);
위는 "프로래밍" 이라는 오타를 "프로그래밍" 이라고 바꾸어 주는 코드입니다.
코드를 한 줄 한 줄 설명하자면,
-
info 문구에서 "프로래밍"이 시작되는 index 는 12입니다.
-
if (firstChar !== -1)
- firstChar 이 -1이 아니면
- 즉, "프로래밍"이라는 문구가 없지 않다면
- 즉, "프로래밍"이라는 문구가 있다면
- "프로래밍" 문구는 12번째에서 시작하므로 firstChar 는 12 입니다. 따라서 조건문은 true.
- "프로래밍"이라는 오타가 포함되어있으면 if 문을 실행합니다.
- info.slice (0, firstChar)
- slice 메소드는 이름 그대로, 텍스트를 잘라주는 함수입니다.
- 그 구조는 다음과 같습니다.
slice(잘릴 시작위치, 잘릴 끝위치)
- 잘릴 시작위치는 0입니다. 잘릴 끝위치는 firstChar 로 12 입니다.
- 그래서 slice 메소드는 info 문구의 0부터 11번째 까지 잘라서 반환합니다.
- 잘릴 끝위치가 조금 헷갈리는데, 잘릴 끝위치의 문구는 포함하지 않습니다.
- 따라서, 12번째의 문자는 포함하지 않습니다. 바로 그 직전에서 끊어줍니다.
console.log(info.slice(0, firstChar));
- info.slice (firstChar+4, info.length);
- 잘릴 시작위치는 16 입니다. (firstChar + 4 = 12 + 4 = 16)
- 잘릴 끝 위치는 22 입니다. (info.length = 22)
- info 의 16번째 문자인 "언" 부터 22번째 문자 이전까지 자르게 됩니다.
- 22번째는 문자가 존재하지 않기 때문에, 그 직전에 끊으니 "."까지 포함하는 문자열로 잘리게 됩니다.
console.log(firstChar+4, info.length);
sliceCityFromAddress 함수를 구현해 주세요.
- sliceCityFromAddress 함수는 address 를 인자로 받습니다.
- address 는 주소를 나타내는 string 입니다.
- 주어진 주소에서 도시를 찾아 삭제하고 새로운 주소를 리턴해 주세요.
- 도시는 무조건 ‘시’로 끝납니다. 예) “서울특별시”, “성남시”
- ‘시’는 주소에 한번만 포함되어 있습니다.
- 예를 들어, 다음과 같은 주소가 주어졌다면
"경기도 성남시 분당구 중앙공원로 53"
- 다음과 같은 값이 리턴되어야 합니다:
"경기도 분당구 중앙공원로 53"
고민한 부분
- "시" 다음부터 잘라내는 코드로 짰더니, 가장 앞에 오는 ~도들이 싹 날아간다. "서울특별시"처럼 "시"로 시작하는 주소에만 작동한다.
- 그렇다고 "시" 앞 글자들을 잘라내는 코드를 짜려니, 이름이 세글자인 "시"도, 네글자인 "시"도, 다섯글자인 "시"도 있는 것 아닌가. 모든 경우의 수에 적용할 수가 없다.
- 그렇다면 우선 "도"를 포함한 주소와 "도를 포함하지 않은("시"만 포함한)" 주소의 두 경우를 각각 코드로 짜야겠다.
해결 코드
function sliceCityFromAddress(address) {
let siChar = address.indexOf("시");
let doChar = address.indexOf("도");
if (doChar == -1) {
address = address.slice(siChar+2, address.length)
}
else { //도와 시 둘 다 있을 때
address = address.slice(0,doChar+1) + address.slice(siChar+1, address.length);
}
return address;
}
- indexOf 메서드는 해당 글자가 포함되지 않은 경우 -1을 반환하므로, 이를 이용하여 "도"를 포함하지 않은 경우의 코드를 짰다. 이 경우 "시" 이후의 주소만 잘라내 반환하면 된다.
- "도"와 "시" 모두 포함하는 주소라면, 주소의 가장 앞 글자부터 "도"까지 잘라내고, "시" 다음 주소를 잘라내 두 문장을 더하여 반환하면 된다.