문자열s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
제한사항
1 ≤s의 길이 ≤ 10,000
s는 영어 소문자로만 이루어져 있습니다.
입출력 예
sresult
"banana"
3
"abracadabra"
6
"aaabbaccccabba"
3
입출력 예 설명
입출력 예 #1 s="banana"인 경우 ba - na - na와 같이 분해됩니다.
입출력 예 #2 s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.
입출력 예 #3 s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.
function solution(s) {
var answer = 0;
let sol = "";
let cnt1 = 0;
let cnt2 = 0;
for (let i = 0; i < s.length; i++) {
// 첫번째 문자열을 비교하기 위해 첫번째 문자열을 sol에 추가해줍니다.
if (sol === "") sol = s[i];
// 만약에 첫번째 들어온 문자와 s[i]번째 들어온 문자가 같으면 cnt1에 1추가, 다르면 cnt2에 1을 추가합니다.
if (sol === s[i]) cnt1++;
else if (sol !== s[i]) cnt2++;
// cnt1과 cnt2가 같으면 answer에 1을 추가하고, 나머지를 초기화합니다.
if (cnt1 === cnt2) {
answer++;
cnt1 = 0;
cnt2 = 0;
sol = "";
}
}
// 2번은은 마지막에 a가 혼자 남으면서 cnt1과 cnt2가 같은 상황으로 끝나지 않았기 때문에 초기화되지 않은 sol이 있다면 answer를 추가해줍니다.
if (sol) answer++;
return answer;
}
웹 브라우저에서 사용자가 화면을 클릭 하거나, 키보드를 클릭하거나 하는 다양한 일들이 일어납니다. 이러한 일들을 이벤트(Event)라고 부릅니다.
용어
이벤트 이름 : 이벤트의 이름을 나타냅니다.
이벤트 속성 : 특정 요소(태그)에 이벤트를 직접 연결할 때 활용하는 속성을 나타냅니다.
이벤트 리스너 또는 핸들러 : 특정 요소(태그)의 이벤트 속성에 연결한 함수를 나타냅니다.
디폴트 이벤트 : 요소(태그)가 가지고 있는 기본적인 이벤트를 나타냅니다. 예로 'a 태그를 클릭하면 href 속성에 정의한 곳으로 이동한다.' 등이 있습니다.
이벤트 모델 : 이벤트를 연결하는 방법을 나타냅니다. 최신 웹 브라우저는 '표준 이벤트 모델', '인라인 이벤트 모델', '기본 이벤트 모델'을 지원하지만, 구버전의 인터넷 익스플로러는 '마이크로소프트 인터넷 익스플로러 이벤트 모델', '인라인 이벤트 모델', '기본 이벤트 모델'을 지원합니다. 따라서 모든 웹 브라우저에서 정상적으로 이벤트를 사용할 수 있게 하려면 구버전과 최신 버전의 차이를 보완하는 방법이 필요합니다.
이벤트 종류
이벤트는 키보드를 이용해 버튼을 입력하거나, 마우스 클릭과 같이 다른 것에 영향을 미치는 것을 의미합니다.
마우스 이벤트
키보드 이벤트
HTML 프레임 이벤트
HTML 입력 양식 이벤트
유저 인터페이스 이벤트
구조 변화 이벤트
터치 이벤트
이벤트 관련 용어 정리
window 객체의 load 이벤트
window.onload = function() {};
이렇게 window 객체의 onload 속성에 함수 자료형을 할당하는 것을 '이벤트를 연결한다'고 합니다.
이때 load를 이벤트 이름 또는 이벤트 타입(Event Type)이라고 하며 onload를 이벤트 속성이라고 합니다. 또한 이벤트 속성에 할당한 함수를 이벤트 리스너(Event Listener) 또는 이벤트 핸들러(Event Handler)라고 합니다.
이벤트 용어 연습 예
<h1 id="header">Header</h1>
window.onload = function() {
var header = document.getElementById('header');
function whenClick() {
alert('click');
}
header.onclick = whenClick;
}
두 가지 이벤트를 연결했습니다. window 객체는 전과 같으며 header 객체의 이벤트 이름은 click, 이벤트 속성은 onclick, 이벤트 리스너는 whenClick() 함수 입니다.
header 객체
이벤트 이름 : click
이벤트 속성 : onclick
이벤트 리스너 : whenClick() 함수
문서 객체에 이벤트를 연결하는 방법을 이벤트 모델이라고 합니다. 이벤트 모델은 아래처럼 DOM Level 단계에 따라 두 가지로 분류할 수 있고, 다시 두 가지로 각각 나뉩니다. 따라서 총 네 가지 방법으로 이벤트를 연결할 수 있습니다.
DOM Level 0 - 인라인 이벤트 모델 - 기본 이벤트 모델
DOM Level 2 - 마이크로소프트 인터넷 익스플로러 이벤트 모델 - 표준 이벤트 모델
이 방법은 웹 표준에서 정의하거나 웹 브라우저가 지원하는 태그의 속성에만 사용할 수 있습니다. 그렇지 않다면 이 방법을 사용할 수 없습니다. 예를 들어 SVG 태그는 웹 브라우저에서 이러한 방식을 지원하지 않기 때문에 이 방법을 사용할 수 없습니다. 웹 브라우저가 지원하지 않는 속성은 아래 표의 메서드를 사용해야 속성을 넣을 수 있습니다.
문서 객체의 속성 메서드
메서드
설명
setAttribute(name, value)
객체의 속성을 지정합니다.
getAttribute(name)
객체의 속성을 가져옵니다.
문서 객체의 속성 지정2 예
window.onload = function() {
var img = document.createElement('img');
img.setAttribute('src', './img/test.png');
img.setAttribute('width', 500);
img.setAttribute('height', 300);
// setAttribute() 메서드를 사용하지 않으면 불가능합니다.
img.setAttribute('data-property', 300);
document.body.appendChild(img);
}
위 코드에 data-property 속성은 이전 코드 방식으로는 넣을 수 없습니다.
문서 객체 3
위 문서 객체 1, 2는 노드를 만들고 연결하는 방법입니다. 일반적으로는 위 코드보다 더 쉬운 방법을 사용합니다.
바로 문서 객체의 innerHTML 속성을 사용하는 것입니다.
문서 객체의 innerHTML 속성은 아래처럼 태그의 내부를 의미하는 속성입니다.
문서 객체의 innerHTML 속성
innerHTML 속성은 아래 코드처럼 사용합니다. 문자열을 선언하고 body 문서 객체의 innerHTML 속성에 넣기만 하면 문서 객체를 생성해줍니다.
만약 화면에 문자열 '<h1>document object model</h1>'을 화면에 그대로 출력하고 싶은 경우에는 innerHTML에 <h1>document object model</h1>를 적으면 되지만 복잡하고 귀찮기 때문에 textContent 속성을 사용합니다.
요소 노드란 HTML 태그를 의미하고, 텍스트 노드는 요소 노드 안에 들어 있는 글자를 의미합니다.
위 코드의 문서 객체 모델
문서 객체 모델
웹 페이지가 처음 HTML 페이지에 적혀 있는 태그들을 읽으며 생성하는 것을 '정적으로 문서 객체를 생성한다'라고 표현합니다. 페이지에 적혀 있는 내용을 특별한 변화 없이 생성해 붙은 이름입니다. 반면에 자바스크립트로 원래 HTML 페이지에는 없던 문서 객체를 생성하는 것을 '동적으로 문서 객체를 생성한다'라고 표현합니다.
웹 브라우저는 음악을 재생하는 기능, 동영상을 재생하는 기능, 그림을 그리는 기능, 미디어를 제어하는 기능, 사용자 카메라를 다루는 기능, 게임 패드를 다루는 기능 등도 제공하며, 자바스크립트를 사용하면 이런 기능들을 모두 활용할 수 있습니다. 이러한 기능을 웹 API라고 부릅니다.
HTML5부터는 플래시와 같은 플러그인을 사용하지 않아도 audio 태그를 사용해서 음악을 재생할 수 있게 되었습니다. (단, 음악 재생은 HTML5를 지원하는 웹 브라우저에서만 사용할 수 있습니다. 따라서 인터넷 익스플로러 8 이하의 웹 브라우저에서는 사용할 수 없습니다. )
Audio 객체 생성 1
var audio = new Audio('test.mp3');
Audio 객체는 위 코드처럼 생성합니다. Audio의 매개변수에는 audio 태그의 src 속성에 대응하는 문자열을 입력합니다.
src 속성을 지정해줄 필요 없이 아래 코드처럼 별도로 지정해도 됩니다.
Audio 객체 생성 2
var audio = new Audio();
audio.src = 'test.mp3';
Audio 객체의 기본 속성
속성
설명
src
재생하려는 음악 파일 경로
volume
음악의 음량
currentTime
음악의 현재 위치 ( 초 단위 )
Audio 객체의 기본 메서드
메서드
설명
play()
음악을 재생합니다.
pause()
음악을 일시 정지합니다.
Audio 객체에는 stop() 메서드가 없습니다. 음악을 정지하고 처음의 위치로 이동하고 싶을 때는 pause() 메서드를 사용하고 currentTime속성을 0으로 바꿔야 합니다.
핸드폰을 확인하는 방법은 크게 '서버에서 확인하는 방법'과 '클라이언트에서 확인하는 방법'이 있습니다. 두 가지 모두 userAgent를 확인하면 됩니다. userAgent 속성은 현재 웹 페이지를 실행하는 웹 브라우저의 정보를 나타냅니다.
userAgent 속성 확인
var userAgent = navigator.userAgent;
console.log(userAgent); // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
웹 브라우저의 userAgent 속성에는 브라우저를 구분할 수 있는 고유 문자열이 있습니다. 안드로이드는 Android, 아이폰이라면 iPhone을 쓰고 있다는 것을 알 수 있습니다.
키워드를 사용하면 모바일 장치를 구분할 수 있습니다.
iPhone: 아이폰
iPod: 아이팟
iPad: 아이패드
Android: 안드로이드
WebOS: 웹 OS
:: 카카오톡, 페이스북에서 링크를 클릭하면 KAKAOTALK등의 글자가 찍힙니다.
스마트폰 구분 예
var smartPhones = ['iphone', 'ipod', 'android'];
for(var i in smartPhones) {
if(navigator.userAgent.toLowerCase().match(new RegExp(smartPhones[i]))) {
console.log('스파트폰 페이지로 이동');
location = 'http://m.naver.com';
}
}
window.orientation 속성 ( 모바일 장치의 방향 )
window.orientation 속성은 모바일 장치에만 있는 속성으로 현재 모바일 장치의 방향을 나타냅니다.
위 코드를 실행하면 웹 브라우저마다 실행 결과가 조금씩 다릅니다. 속성만 출력하는 브라우저가 있고, 메서드까지 출력하는 브라우저가 있습니다.
location 객체의 속성
속성
설명
예
href
문서의 URL 주소
host
호스트 이름과 포트 번호
localhost:12345
hostname
호스트 이름
localhost
port
포트 번호
12345
pathname
디렉토리 경로
/myweb/
hash
앵커 이름(#~)
#beta
search
요청 매개변수
?page=test
protocol
프로토콜 종류
http:
location 객체의 메서드
속성
설명
assign(link)
현재 위치를 이동합니다.
reload()
새로고침합니다.
replace(link)
현재 위치를 이동합니다.
location 객체는 페이지를 이동할 때 많이 사용합니다. 아래 네 가지 방법으로 페이지를 이동할 수 있습니다. assign() 메서드와 replace() 메서드 모두 페이지를 이동하지만, replace() 메서드는 assign() 메서드와 다르게 뒤로 가기 버튼을 사용할 수 없다는 차이가 있습니다.