DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

DOM Tree

문제로 돌아가기

해설

각 노드의 HTML 표현은 정의 그대로 DFS 순서로 만들 수 있다. 다만 트리의 깊이가 NNN까지 커질 수 있으므로, 전체 제약에서는 재귀 호출 대신 명시적인 스택을 사용하면 안전하다.

스택에는 (v,state)(v,\mathrm{state})(v,state)를 저장한다. state=0\mathrm{state}=0state=0은 노드에 처음 들어가는 사건, state=1\mathrm{state}=1state=1은 태그 노드의 모든 자식을 처리한 뒤 빠져나오는 사건이라고 하자.

노드 vvv에 처음 들어갈 때 다음과 같이 처리한다.

  • 텍스트 노드라면 문자열을 결과에 그대로 붙인다.
  • 태그 노드라면 여는 태그를 붙이고, (v,1)(v,1)(v,1)을 스택에 넣는다. 그 뒤 자식들을 역순으로 스택에 넣는다.

스택은 마지막에 넣은 원소부터 처리하므로 자식들을 역순으로 넣으면 실제 방문 순서는 입력에서 주어진 순서가 된다. (v,1)(v,1)(v,1)을 꺼낼 때는 닫는 태그를 붙인다.

모든 테스트 케이스에서 노드 수의 합을 SSS, 출력 문자열 길이의 합을 LLL이라 하자. 각 노드와 출력 문자를 상수 번 처리하므로 시간 복잡도는 O(S+L)O(S+L)O(S+L)이다. 한 테스트 케이스를 처리하는 데 필요한 메모리는 O(N+L)O(N+L)O(N+L)이다.

Solution written by GPT5.6