만약 "경기도" 옆에 "도기도"라는 새로운 도가 생기면 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 메서드를 사용하여 문자열을 배열로 만드는 방법이 가장 깔끔한 것 같다.
if...else문을 만들 때 true가 될 경우가 많은 조건을 if문에 넣고, 다른 조건을 else문에서 처리하는 것이 좋다 프로그램 실행 시간이 더 짧을 것
for문에서 반복 횟수의 기준이 되는 변수를 카운터 변수라고 한다 보통 i라고 이름을 붙이고 0으로 초기화 한다 반복문을 시작하기 전에 반드시 초기화 해야 한다
여러 값을 차례로 순회할 때는 for...of문을 사용한다
let seasons = ["봄", "여름", "가을", "겨울"];
for(let value of seasons) {
console.log(value);
}
결과는 봄 여름 가을 겨울
<script> 태그 안에서 HTML 태그를 사용하려면 쌍따옴표 안에 적는다 ex) document.write("<br>");
for문은 횟수가 정해져 있는 반복 명령을 작성할 때 편리 while문과 do...while문은 특정 조건을 만족하는 동안에만 명령을 반복
do...while문은 조건이 맨 뒤에 붙는다 일단 문장을 한 번 실행한 후 조건을 확인한다
어떤 반복문을 사용해야 할까? -> for문은 초기값이 있으면서 일정한 간격으로 반복할 때 while문과 do...while문은 초기값, 반복 간격이 없고 조건만 주어짐 while문과 do...while문의 차이는 조건 확인 전에 문장을 한 번 실행하느냐 안하느냐의 차이
정리
if 조건이 true면 소스 실행, false면 소스 무시
if...else 조건이 맞을 때 실행할 명령과 맞지 않을 때 실행할 명령이 따로 있다면 if...else 문 사용
조건 연산자 : 물음표, 콜론 -> 조건이 하나, 실행할 명령도 하나면 조건 연산자가 간단 (조건) ? (true일 때 실행) : (false일 때 실행)
switch, case 조건이 3개 이상일 때 사용 break문은 명령을 실행한 다음에는 완전히 switch문을 빠져나오도록 한다 default는 case 조건에서 전부 일치하지 않을 때 실행하는 명령
var session = prompt("관심 세션을 선택해 주세요. 1-마케팅, 2-개발, 3-디자인","1");
switch(session) {
case "1" : document.write("<p>마케팅 세션은 <strong>201호</strong>에서 진행됩니다.</p>");
break;
case "2" : document.write("<p>개발 세션은 <strong>203호</strong>에서 진행됩니다.</p>");
break;
case "3" : document.write("<p>디자인 세션은 <strong>205호</strong>에서 진행됩니다.</p>");
break;
default: alert("잘못 입력했습니다.");
}
for 값이 일정하게 커지면서 명령을 반복 실행할 때 편리한 반복문 중첩가능
var sum = 0;
for (var i = 1; i < 6; i++) {
sum += i;
}
document.write("1부터 5까지 더하면 " + sum);
1부터 5까지 더하는 프로그램
for(카운터 변수 선언; 조건식; 카운터 변수 조절) -> 선언, 조건, 조절
while, do...while 특정 조건 만족하는 동안에만 명령 반복
var i = 0;
while (i<10) {
document.write('반복 조건이 true이면 반복합니다. <br>');
i += 1;
}
// while문
var i = 0;
do {
document.write('반복 조건이 true이면 반복합니다. <br>');
i += 1;
} while (i<10);
// do...while문
break break는 반복문의 흐름에서 바로 빠져나올 때 사용
for (i=0; i<10; i++) {
document.write("*");
break; // 이 지점에 오면 바로 반복문 종료
}
결과는 * 하나
continue 주어진 조건에 맞는 값을 만났을 때 실행하던 반복 문장을 건너뛰고 맨 앞으로 되돌아 가서 반복 다시 시작
for (i=0; i<10; i++) {
document.write("*");
continue;
document.write("continue문 때문에 이 문장은 건너뜁니다.");
}
결과는 * 10개
var n = 10;
var sum = 0;
for(var i=1; i<=n; i++) {
if(i%2==1) {
continue;
}
sum += i;
document.write(i + " ------ " + sum + "<br>");
}