Assignment

  • sliceCityFromAddress 함수는 address 를 인자로 받습니다.
  • address 는 주소를 나타내는 string 입니다.
  • 주어진 주소에서 도시를 찾아 삭제하고 새로운 주소를 리턴해 주세요.
  • 도시는 무조건 ‘시’로 끝납니다. 예) “서울특별시”, “성남시”
  • ‘시’는 주소에 한번만 포함되어 있습니다.
  • 예를 들어, 다음과 같은 주소가 주어졌다면다음과 같은 값이 리턴되어야 합니다.

"경기도 성남시 분당구 중앙공원로 53" -> "경기도 분당구 중앙공원로 53"

 


 

위코드 자바스크립트 19번 과제다.

다른 풀이 방법을 보면 "시" 뿐만 아니라  "도"까지 생각하던데

그런 풀이가 맞는지 잘 모르겠다.

 

만약 "경기도" 옆에 "도기도"라는 새로운 도가 생기면 address.indexOf("도")는 달라지는 것 아닌가?

 

나는 이렇게 생각했다.

- 광역시, 특별시를 제외한 도시 이름 (예: 성남시) 앞에는 항상 공백이 존재한다.

- 광역시, 특별시는 주소 상 가장 앞에 온다.

 

그렇다면, 도시 이름의 첫번째 문자 인덱스를 찾으려면 (예: 성남시의 "성")

- "시" 에서 거꾸로 검사하여 처음 나오는 공백을 찾고 +1 한다.

- 전 단계에서 공백이 나오지 않으면 광역시, 특별시이므로 해당 인덱스는 0이다.

 

의식의 흐름을 쪼개어 공책에 순서대로 적어본다.

1. address 문자열을 인수로 받음

2. 인수에서 "시"로 끝나는 도시를 찾음 
  2-1. address.indexOf("시")
  2-2. 그 앞에 처음으로 나오는 공백(" ")을 찾는다.
  2-3. 공백이 없으면 도시 이름의 첫번째 글자 인덱스에 address[0]을 할당
  2-4. 도시 이름 문자의 시작과 끝의 인덱스를 모두 찾았다.

3. 도시를 address에서 삭제 -> 도시를 제외한 나머지 문자들을 연결한다.

4. 도시가 삭제된 결과를 리턴한다.

 

2-2번은 for 문을 거꾸로 돌리면 쉽게 해결되나

문제는 2-3번, <앞의 문자열에 공백이 없으면> 이라는 조건을 컴퓨터가 알아듣게 써줄 방법을 찾기가 어려웠다.

 

집으로 가는 전철에서 곰곰히 생각해보니 방법이 떠올랐다.

 

=> 첫번째 공백의 인덱스와 "시" 인덱스를 비교하는 분기를 추가한다. 

 

즉, 첫번째 공백이 "시"보다 먼저 있으면 "경기도 성남시" 같은 주소이고,

첫번째 공백이 "시"보다 나중에 있으면 "서울특별시 강남구" 같은 주소다.

 

코드는 다음과 같다.

function sliceCityFromAddress(address) {
  let cityNameLastChar = address.indexOf("시");
  let cityNameFirstChar;
  const blank = address.indexOf(" "); // address 배열에서 첫번째 공백 인덱스 번호

  if (cityNameLastChar === -1) {
    alert("주소에 도시를 포함해주세요.")
    return;
  }
  
  // console.log(cityNameLastChar)
  // console.log(cityNameFirstChar)
  // console.log(blank)
  
  if (blank > cityNameLastChar) {
    cityNameFirstChar = 0; // 첫번째 공백이 "시" 보다 나중에 있으면 도시 이름의 첫번째 문자 인덱스는 0
  } else { // 첫번째 공백이 "시" 보다 먼저 있으면
    for (let i = cityNameLastChar; i >= 0; i--) {
      if (address[i] === " ") {
      cityNameFirstChar = i + 1; // "시" 인덱스 번호에서 거꾸로 조회하여 빈문자열을 찾고 1 더한 값을 도시 이름의 첫번째 인덱스로 설정
      }    
    }
  }
  
  // console.log(cityNameLastChar)
  // console.log(cityNameFirstChar)
  // console.log(blank)

  const newAddress = address.slice(0, cityNameFirstChar) + address.slice(cityNameLastChar+2, address.length);
  
  return newAddress;
}
console.log(sliceCityFromAddress("경기도 성남시 분당구 중앙공원로 53"));
console.log(sliceCityFromAddress("서울특별시 강남구 선릉로 4"));
console.log(sliceCityFromAddress("서울 아주특별시 강남구 선릉로 4"));

 

이렇게 하면

"경기도 성남시 분당구 중앙공원로 53",

"서울특별시 강남구 선릉로 4",

"서울 아주특별시 강남구 선릉로 4"

같은 주소도 모두 처리할 수 있다.

(시흥시는 처리 못함..)

 

그렇지만 split, filter, join 메서드를 사용하여 문자열을 배열로 만드는 방법이 가장 깔끔한 것 같다. 

 

+ Recent posts