2014년 9월 29일 월요일

[AlgoSpot] URL


  • 항상 코딩에서 문제를 발견하고 해결하는 부분이 너무나도 어이없는 부분이듯이 이 문제에서도 어이없게도 println대신 print를 써서 14번동안시도중 13번의 제출동안 해매게 되었습다.... ㅠ.ㅠ
  • 처음 문제 제출을 하였을 때 문제점은 replaceAll에 대한 메소드에 대한 것이였다. 

public String replaceAll(String regex, String replacement)
  • replaceAll에서 regex는 정규표현식을 뜻하는 것이므로 ""으로 감싼 단순한 String으로 써서는 안된다. 때문에 정규 표현식을 사용하여 적어 넣어야 한다. 즉 "%20"이 아닌 "(%20)"이 되어야 한다.
  • replacement에서도 마찬가지 이므로 특수문자인 $을 인식시키기 위해서 \\을 사용하여야 합니다.
  • 마지막으로 저는 처음부터 찾은 함정입니다. %25 -> %으로 바꿔줘야 하는데 이 부분은 제일 마지막에 해줘야 합니다. 쉽게 '%252a'을 예로 들었을 경우 %252a -> %2a -> * 가 되기 때문입니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        while(cases-- > 0) {
            String uri = sc.next();

            uri = uri.replaceAll("(%20)", " ");
            uri = uri.replaceAll("(%21)", "!");
            uri = uri.replaceAll("(%24)", "\\$");
            uri = uri.replaceAll("(%28)", "(");
            uri = uri.replaceAll("(%29)", ")");
            uri = uri.replaceAll("(%2a)", "*");
            uri = uri.replaceAll("(%25)", "%");
            System.out.println(uri);
        }
    }
}

  • 취준생의 공부 정리 방입니다. algospot 게시물에서 문제 풀이에 대한 포스팅은 언제나 환영이라는 글을 보았기에 정리겸, 공부겸 겸사겸사 문제풀이를 올립니다. 저작권에 문제 있을시 자삭하겠습니다.
  • 엉터리일수도(아마도 대부분) 느리기도 하지만 풀었다는 것에 의의를 두고 있습니다.



    2014년 9월 1일 월요일

    [Web HomePage,Java] 댓글 구현하기 - DB

    개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
    사용 툴 : STS, MySQL Workbench 6.1 CE
    • ※저 스스로 로직과 테이블, jsp를 배우면서 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
    • 댓글 구현의 어려움 -> 댓글의 댓글 구현하기
      • 이를 해결하기 위해서 grp, grp_num을 이용하여 덧글마다의 그룹을 만들어 댓글의 댓글은 그룹으로 묶어서 정렬함
      • order by grp asc ,grp_num asc를 하여 grp을 1순위, grp_num을 2순위로 정렬하여 select한다.


     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    CREATE TABLE `comment_board` (
       `num` int(20) unsigned NOT NULL,
       `grp` int(20) unsigned NOT NULL,
       `grp_num` int(10) unsigned NOT NULL DEFAULT '0',
       `depth` int(10) unsigned NOT NULL DEFAULT '0',
       `content` varchar(500) NOT NULL,
       `id` varchar(20) NOT NULL,
       `date` datetime NOT NULL,
       `good` int(10) unsigned NOT NULL DEFAULT '0',
       `bad` int(10) unsigned NOT NULL DEFAULT '0'
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    //호출 쿼리
    select * from comment_board where num = #{num} order by cb_grp asc ,cb_grp_num asc;
    


    • num, grp, grp_num, depth는 controller에서 값을 가져온다.
    • 삽입 - 댓글일때
      • grp을 증가시킨다. grp_num은 1으로 둔다. depth는 0으로 둔다.
    • ifnull을 사용하여 해당글에 처음 쓰는 댓글이라면 자동으로 grp값을 1로 주도록 하였다.

    1
    insert into comment_board select #{num}, ifnull(max(grp)+1,1) grp, 1,0, #{content}, #{id}, now(), 0,0 from comment_board where num = #{num}; 
    


    • 삽입 - 댓글의 댓글일때
      • 해당 grp의 grp_num의 넣을 위치보다 큰 grp_num을 모두 1씩 증가시킨다.
        • 아래로 한칸씩 미룬다.
      • depth를 증가시킨후 해당 grp_num에 넣는다,

    1
    2
    3
    4
    //해당 게시물(num) grp grp_num 넣을 위치보다  grp_num 모두 1 증가시킨다.
    update comment_board set grp_num=grp_num+1 where num = #{num} and grp = #{grp} and grp_num > #{grp_num};
    //depth 증가시킨후 해당 num,grp,grp_num 넣는다,
    insert into comment_board(#{num},#{grp}, #{cb_grp_num} ,#{depth}+1, #{content}, #{id}, now(), 0,0);