1. ๋ฌธ์ ์ ๋ํ์ฌ ๐ฆ
- ๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/22859
(1) ์กฐ๊ฑด ๋ถ์ ๐
/*
* 1. main ํ๊ทธ ์ง์ฐ๊ธฐ v* 2. div ๋ณ๋ก ๊ตฌ๋ถ v* 3. div์์ title ์ถ์ถํด์ ์ถ๋ ฅ v* 4. div ๋ด๋ถ์ Pํ๊ทธ ํ๋๋น ๋ค์ ๊ณผ์ ์งํ
* (1) P ํ๊ทธ ๋ด๋ถ์ ๋ชจ๋ ํ๊ทธ ์ง์ฐ๊ธฐ
* (2) ๋ฌธ์ฅ ์์๊ณผ ๋์ ๊ณต๋ฐฑ ์ง์ฐ๊ธฐ
* (3) ๊ณต๋ฐฑ 2๊ฐ์ง๋ฆฌ๋ ํ๋๋ก ๋ฐ๊พผ๋ค.
* (4) P ํ๊ทธ ์์ฒด๋ฅผ ์ง์ฐ๊ธฐ
* */
2. ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐ ๏ธ
KEY WORD: ์ ๊ท ํํ์
- ์ ๊ท ํํ์์ผ๋ก div ํ๊ทธ ์ถ์ถ -> title๋ง ๋นผ์ ์ถ๋ ฅ
- ์ ๊ท ํํ์์ผ๋ก p ํ๊ทธ ์ถ์ถ -> ์์ 4๊ฐ์ง ๊ณผ์ ํ๊ณ ๊ธ๋ง ์ถ๋ ฅ
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ โณ
์ ๊ทํํ์ ํจํด์ ์ฐพ๋ Matcher๋ ๋ด๋ถ์ ์ผ๋ก ๋ฌธ์๋ฅผ ํ๋ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ฌดํจํ๋ฉด ๋ค์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฐพ๋ ๋ฐฑํธ๋ํน์ผ๋ก ๋ด๋ถ๊ฐ ๊ตฌํ๋์ด ์๊ธฐ ๋๋ฌธ์ for๋ฌธ ๋จ์ ํ์ด๋ณด๋ค ํจ์ฌ ๋๋ ธ๋ค.
for๋ฌธ์ผ๋ก ํผ ์ฌ๋๋ค์ 900ms ๋๊ฐ ๋์๋๋ฐ ๋ด ํ์ด๋ ์ ๊ท ํํ์์ ์ด ๋ด ํ์ด๋ 2000ms
๋ฐ๋ผ์ ์ ๊ท ํํ์์ ์ฐ๋ฉด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ธด ํ์ง๋ง, SQL๋ฌธ ํ์ด์์ ๋ง๊ณ ๋ ์ ์ ์ธ ๋ฏํ๋ค.
3. ์ฝ๋ ๐
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 1. main ํ๊ทธ ์ง์ฐ๊ธฐ v* 2. div ๋ณ๋ก ๊ตฌ๋ถ v* 3. div์์ title ์ถ์ถํด์ ์ถ๋ ฅ v* 4. div ๋ด๋ถ์ Pํ๊ทธ ํ๋๋น ๋ค์ ๊ณผ์ ์งํ
* (1) P ํ๊ทธ ๋ด๋ถ์ ๋ชจ๋ ํ๊ทธ ์ง์ฐ๊ธฐ
* (2) ๋ฌธ์ฅ ์์๊ณผ ๋์ ๊ณต๋ฐฑ ์ง์ฐ๊ธฐ
* (3) ๊ณต๋ฐฑ 2๊ฐ์ง๋ฆฌ๋ ํ๋๋ก ๋ฐ๊พผ๋ค.
* (4) P ํ๊ทธ ์์ฒด๋ฅผ ์ง์ฐ๊ธฐ
* */
/*
* 1. split์ผ๋ก '<p>'๋ก ๊ตฌ๋ถํ๊ธฐ
* 2. main์ ๋ฒ๋ฆฌ๊ธฐ div๋ "\w+" ํจํด์ผ๋ก ํ์ดํ ์ ๋ชฉ ์ถ์ถํด์ ์ถ๋ ฅ
* 3. p ํ๊ทธ์ ๊ฒฝ์ฐ ์์ ๊ณผ์ ๊ทธ๋๋ก ํ๋์ฉ ์งํ
* */
public class Main {
static StringBuilder answer = new StringBuilder();
static HashMap<Integer, String> location = new HashMap<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String html = br.readLine();
Matcher title = Pattern.compile("<div title=\"(\\w|_|\\s)*\">").matcher(html);
Matcher paragraph = Pattern.compile("<p>(\\w|\\s|</?[^p]>|</?\\w{2,}\\s?>|\\.)*</p>").matcher(html);
while(title.find()) location.put(title.start(), "title : " + title.group().replaceAll("<div title=\"(.*)\">", "$1"));
while (paragraph.find()){
String row = paragraph.group();
row = row.replaceAll("(</?\\w*\\s?>)", "");
row = row.replaceAll("\\s{2,}", " ");
row = row.trim();
location.put(paragraph.start(), row);
}
ArrayList<Integer> keys = new ArrayList<>();
for(int temp : location.keySet()){
keys.add(temp);
}
Collections.sort(keys);
for (int key : keys){
answer.append(location.get(key)).append("\n");
}
System.out.println(answer);
}
}
4. ํธ๋ฌ๋ธ ์ํ or ๋ฐฐ์ด ์ ๐
- ์ ๊ท ํํ์์ ์๊ฐ๋ณด๋ค ํจ์ฌ ๋๋ฆฌ๋ค.
- ์ ๊ท ํํ์์ ๋ถ๋ถ์ ์ผ๋ก๋ง ์จ์ ๋๋จธ์ง๋ ์ฝ๋๋ก ํด๊ฒฐํ๋ ค๋ ํ์ด๋ Edge Case์์ ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ๋ค.
import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;
/*
- main ํ๊ทธ ์ง์ฐ๊ธฐ v
- div ๋ณ๋ก ๊ตฌ๋ถ v
- div์์ title ์ถ์ถํด์ ์ถ๋ ฅ v
- div ๋ด๋ถ์ Pํ๊ทธ ํ๋๋น ๋ค์ ๊ณผ์ ์งํ
(1) P ํ๊ทธ ๋ด๋ถ์ ๋ชจ๋ ํ๊ทธ ์ง์ฐ๊ธฐ
(2) ๋ฌธ์ฅ ์์๊ณผ ๋์ ๊ณต๋ฐฑ ์ง์ฐ๊ธฐ
(3) ๊ณต๋ฐฑ 2๊ฐ์ง๋ฆฌ๋ ํ๋๋ก ๋ฐ๊พผ๋ค.
(4) P ํ๊ทธ ์์ฒด๋ฅผ ์ง์ฐ๊ธฐ
/
/- split์ผ๋ก '
'๋ก ๊ตฌ๋ถํ๊ธฐ
- split์ผ๋ก '
- main์ ๋ฒ๋ฆฌ๊ธฐ div๋ "\w+" ํจํด์ผ๋ก ํ์ดํ ์ ๋ชฉ ์ถ์ถํด์ ์ถ๋ ฅ
- p ํ๊ทธ์ ๊ฒฝ์ฐ ์์ ๊ณผ์ ๊ทธ๋๋ก ํ๋์ฉ ์งํ
/
public class Main {
static Pattern title = Pattern.compile(""."");
static StringBuilder answer = new StringBuilder();
public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String html = br.readLine(); String [] tags = denoteByPTag(html); for (String row : tags){ if(row.contains("<div")) extractTitle(row); else extractP(row); } System.out.println(answer.toString().trim());}
public static String [] denoteByPTag(String html) {
return html.split("</?(?:main|p)>");}
public static void extractTitle(String row){
Matcher findTitle = title.matcher(row); if(findTitle.find()){ // ๋งค์นญ ์์ผ์ค์ผ ํจ. String title = findTitle.group(); title = title.substring(1, title.length()-1); answer.append("title : ").append(title).append("\n"); }}
public static void extractP(String row) {
if(row.trim().isEmpty()) return; // (1) P ํ๊ทธ ๋ด๋ถ์ ๋ชจ๋ ํ๊ทธ ์ง์ฐ๊ธฐ String [] elements = row.split("</?\\w+\\s?>"); // (2) ๋ฌธ์ฅ ์์๊ณผ ๋์ ๊ณต๋ฐฑ ์ง์ฐ๊ธฐ - ์๋ // (3) ๊ณต๋ฐฑ 2๊ฐ์ง๋ฆฌ๋ ํ๋๋ก ๋ฐ๊พผ๋ค. - ์๋ // (4) P ํ๊ทธ ์์ฒด๋ฅผ ์ง์ฐ๊ธฐ - ์๋ StringBuilder rowBuilder = new StringBuilder(); for(String element : elements){ element = element.trim(); if(element.isEmpty()) continue; rowBuilder.append(element).append(" "); } answer.append(rowBuilder.toString().trim()); answer.append("\n");}
}
์ด๋ ๊ฒ ๋ถ๋ถ๋ง ๋นผ๋ ค๊ณ ํ๋๋ฐ ์๊พธ ํ๋ฆฐ๋ค.
์ฆ ์ ๊ทํํ์์ ์ธ๊ฑฐ๋ฉด ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ฐ์ ํ ์ ์์ด์ผ ํ๋ค.
์ด ๋ถ๋ถ์์๋ ์ฝ๋ฉํ
์คํธ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํ์ฌ ํํ์์ ๋
น์ฌ๋ด์ง ๋ชปํ๋ฉด ์ ๊ท ํํ์ ํ์ด๊ฐ ac๋ฅผ ๋ฐ๊ธฐ์๋ ์กฐ๊ธ ๋ฌด๋ฆฌ์ผ ๊ฒ ๊ฐ๋ค.