2014년 11월 3일 월요일

[AlgoSpot] DRAWRECT

  • 접근방법
    • 사각형은 각각 같은 라인에 2점씩 위치하게 됩니다.
    • 때문에 x축 좌표와, y축 좌표에 있어서 각각 2개씩 존재하게 됩니다.
    • 총 입력받은 3개의 좌표죽에 같은 x축,y축 값이 없는 좌표를 출력합니다.




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

public class DRAWRECT {

    public static void main(String[] args) {
     Scanner sc = new Scanner(System.in);
  int cases = sc.nextInt();
  while (cases-- > 0) {
   int x[] = new int[3];
   int y[] = new int[3];
   
   x[0] = sc.nextInt();
   y[0] = sc.nextInt();

   x[1] = sc.nextInt();
   y[1] = sc.nextInt();

   x[2] = sc.nextInt();
   y[2] = sc.nextInt();

   System.out.println((x[0]==x[1]?x[2]:x[0]==x[2]?x[1]:x[0])+" "+(y[0]==y[1]?y[2]:y[0]==y[2]?y[1]:y[0]));
  }
    }
}



  • 취준생의 공부 정리 방입니다. algospot 게시물에서 문제 풀이에 대한 포스팅은 언제나 환영이라는 글을 보았기에 정리겸, 공부겸 겸사겸사 문제풀이를 올립니다. 저작권에 문제 있을시 자삭하겠습니다.

  • 엉터리일수도(아마도 대부분) 느리기도 하지만 풀었다는 것에 의의를 두고 있습니다.
  • [AlgoSpot] STRJOIN

    • 접근방법
      • 누계하는 비용을 최소화 하는 문제입니다.
      • 가장 비용이 적게 드는(크기가 작은 문자열) 2개를 합하여 새로운 비용을 등록하고 기존의 문자열크기 2개 삭제
      • 위를 반복하고 비용의 누적을 출력
    • 해결방법
      • 적은 문자열(비용)을 구하기 위하여 ArrayList를 이용하여 Sort를 사용
      • add, remove, get을 적절히 사용


     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class STRJOIN {
    
        public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
      int cases = sc.nextInt();
      while (cases-- > 0) {
       int n = sc.nextInt();
       ArrayList list = new ArrayList();
       for(int i = 0;n>i;i++)
        list.add(sc.nextInt());
       
       int tmp=0,cost=0;
       for(int i = 0;n-1>i;i++){
        Collections.sort(list);
        tmp=(int)list.get(0)+(int)list.get(1);
        cost+=tmp;
        list.add(tmp);
        list.remove(0);
        list.remove(0);
       }
       System.out.println(cost);
      }
        }
    }
    

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

    [AlgoSpot] FIX

    • Collection의 sort 메소드를 이용하여 쉽게 정렬하고 이를 이용하여 정리를 하고 비교하는 방식으로 하였습니다.


     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class FIX {
    
        public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
      int cases = sc.nextInt();
      while (cases-- > 0) {
       int times = sc.nextInt();
       ArrayList<integer> Q = new ArrayList<integer>();
       for(int i=0;times&gt;i;i++)
        Q.add(sc.nextInt());
       ArrayList<integer> copy_Q = new ArrayList<integer>(Q);
       Collections.sort(Q);
       int count = 0;
       for(int i = 0;times&gt;i;i++)
        if(Q.get(i)==copy_Q.get(i))
         count++;
       
       System.out.println(count);
      }
        }
    }
    




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

    [AlgoSpot] WEEKLYCALENDAR

    • 주일달력 만들기 입니다.
    • 요일을 인식하여 인덱스로 반환하는 부분을 if문이나 삼항연산사로 실험해보았으나 해쉬맵을 이용하는 방법이 조금이나마 빨랐습니다.
    • 요일을 입력받아 요일에 해당하는 위치를 인덱스로 반환하여 for문으로 출력할때에 정확한 위치에 나오도록 하였습니다.




     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import java.util.HashMap;
    import java.util.Scanner;
    
    public class WEEKLYCALENDAR {
    
        public static void main(String[] args) {
         int end_day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
         HashMap<string integer=""> days= new HashMap<string integer="">();
         days.put("Sunday", 1);
         days.put("Monday", 2);
         days.put("Tuesday", 3);
         days.put("Wednesday", 4);
         days.put("Thursday", 5);
         days.put("Friday", 6);
         days.put("Saturday", 7);
         Scanner sc = new Scanner(System.in);
      int cases = sc.nextInt();
      while (cases-- &gt; 0) {
       int month = sc.nextInt();
       int last_month = month==1?11:month-2;
       int day = sc.nextInt();
       String week = sc.next();
       int index = days.get(week);
       int weeks[] = new int[7];
                for(int i=1;7&gt;=i;i++){
                    int print = day-index+i&lt;1 data-blogger-escaped-day-index="" data-blogger-escaped-end_day="" data-blogger-escaped-i="" data-blogger-escaped-last_month=""&gt;end_day[month-1]?day-index+i-end_day[month-1]:day-index+i);
                    weeks[i-1]=print;
                }
       System.out.println(weeks[0]+" "+weeks[1]+" "+weeks[2]+" "+weeks[3]+" "+weeks[4]+" "+weeks[5]+" "+weeks[6]);
      }
        }
    }
    

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

    • 단순 해밍코드 구현입니다. 이문제에서는 7 4 해밍코드 구현입니다.



     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import java.util.Scanner;
    
    public class HAMMINGCODE {
    
        public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int cases = sc.nextInt();
      while (cases-- &gt; 0) {
       String sInput = sc.next();
       char[] cInput = sInput.toCharArray();
       int iParity = (cInput[0]^cInput[2]^cInput[4]^cInput[6])*1+(cInput[1]^cInput[2]^cInput[5]^cInput[6])*2+(cInput[3]^cInput[4]^cInput[5]^cInput[6])*4;
       if(iParity != 0){
        cInput[iParity-1] = cInput[iParity-1]=='0'?'1':'0';
       }
       char[] output = new char[]{cInput[2],cInput[4],cInput[5],cInput[6]};
       System.out.println(output);
      }
        }
    }
    

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

    [자료구조, Java] Insertion Sort(삽입 정렬)

    Insertion Sort(삽입 정렬)

    출처 : 위키백과
    • 시간복잡도 : O(n^2)
    • 앞에서 부터 차례대로 이미 정렬된 배열 부분과 비교하여, 알맞는 대소관계의 위치에 위치하여 정렬
    • 장점 : 쉬운 구현
    • 단점 : 배열이 길어질수록 
    java 구현

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class Insertion_Sort {
     //난수 생성 메소드
     public int[] make_rnd(int size){
      //중복값 제거를 위하여 Set으로 값 관리
      Set rnd = new HashSet();
      int rnd_list[] = new int[size];
      for(int i = 0;size>i;i++){
       //1~99사이의 난수값 생성
       int tmp = (int) (Math.random() * 99)+1;
       rnd.add(tmp);
       //중복값 생성시 다시 생성
       if (rnd.size() == i + 1)
        i--;
       else
        rnd_list[i]=tmp;
      }
      System.out.println("원본 배열 생성");
      array_print(rnd_list, size);
      return rnd_list;
     }
     
     //배열 출력 메소드
     public void array_print(int rnd_list[],int size){
      System.out.print("[ ");
      for(int i=0;size>i;i++){
       System.out.print(rnd_list[i]+ " ");
      }
      System.out.println("]");
     }
     
     
     public static void main(String args[]){
      int size = 10;
      Insertion_Sort sort= new Insertion_Sort();
      int rnd_list[] = sort.make_rnd(size);
      
      //버블정렬 i = 차수
      for (int i = 1; size > i; i++) {
       //j비교 위치
       for (int j = 0; i > j; j++) {
        //2개 값 비교하여 정렬
        if(rnd_list[j]>rnd_list[i]){
         int tmp[] = new int[size];
         System.arraycopy(rnd_list, 0, tmp, 0, j);
         tmp[j]=rnd_list[i];
         System.arraycopy(rnd_list, j, tmp, j+1, i-j);
         System.arraycopy(rnd_list, i+1, tmp, i+1, size-(i+1));
         rnd_list = tmp;
         break;
        }
       }
       System.out.println(i+"차 정렬");
       sort.array_print(rnd_list, size);
      }
     }
    }
    
    원본 배열 생성 [ 64 95 54 82 18 69 43 7 68 29 ]
    1차 정렬 [ 64 95 54 82 18 69 43 7 68 29 ]
    2차 정렬 [ 54 64 95 82 18 69 43 7 68 29 ]
    3차 정렬 [ 54 64 82 95 18 69 43 7 68 29 ]
    4차 정렬 [ 18 54 64 82 95 69 43 7 68 29 ]
    5차 정렬 [ 18 54 64 69 82 95 43 7 68 29 ]
    6차 정렬 [ 18 43 54 64 69 82 95 7 68 29 ]
    7차 정렬 [ 7 18 43 54 64 69 82 95 68 29 ]
    8차 정렬 [ 7 18 43 54 64 68 69 82 95 29 ]
    9차 정렬 [ 7 18 29 43 54 64 68 69 82 95 ]

    2014년 10월 7일 화요일

    [자료구조, Java] BuubleSort

    Bubble Sort(버블 정렬)
    출처 : 위키백과
    • 시간복잡도 : O(n^2)
    • 인접한 두 인자(즉, 2개씩) 비교해가며 반복하여 정렬
    • 장점 : 쉬운 구현
    • 단점 : 느리다.
    java 구현
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public class Bubble_Sort {
     //난수 생성 메소드
     public int[] make_rnd(int size){
      //중복값 제거를 위하여 Set으로 값 관리
      Set rnd = new HashSet();
      int rnd_list[] = new int[size];
      for(int i = 0;size>i;i++){
       //1~99사이의 난수값 생성
       int tmp = (int) (Math.random() * 99)+1;
       rnd.add(tmp);
       //중복값 생성시 다시 생성
       if (rnd.size() == i + 1)
        i--;
       else
        rnd_list[i]=tmp;
      }
      System.out.println("원본 배열 생성");
      array_print(rnd_list, size);
      return rnd_list;
     }
     
     //배열 출력 메소드
     public void array_print(int rnd_list[],int size){
      System.out.print("[ ");
      for(int i=0;size>i;i++){
       System.out.print(rnd_list[i]+ " ");
      }
      System.out.println("]");
     }
     
     
     public static void main(String args[]){
      int size = 10;
      Bubble_Sort sort= new Bubble_Sort();
      int rnd_list[] = sort.make_rnd(size);
      
      //버블정렬 i = 차수
      for (int i = 0; size - 1 > i; i++) {
       //j비교 위치
       for (int j = 0; size - 1 > j; j++) {
        //2개 값 비교하여 정렬
        if (rnd_list[j] > rnd_list[j + 1]) {
         int tmp = rnd_list[j + 1];
         rnd_list[j + 1] = rnd_list[j];
         rnd_list[j] = tmp;
        }
       }
       System.out.println(i+1+"차 정렬");
       sort.array_print(rnd_list, size);
      }
     }
    }
    
     
    원본 배열 생성
    [ 89 31 19 63 55 59 97 5 61 94 ]
    1차 정렬
    [ 31 19 63 55 59 89 5 61 94 97 ]
    2차 정렬
    [ 19 31 55 59 63 5 61 89 94 97 ]
    3차 정렬
    [ 19 31 55 59 5 61 63 89 94 97 ]
    4차 정렬
    [ 19 31 55 5 59 61 63 89 94 97 ]
    5차 정렬
    [ 19 31 5 55 59 61 63 89 94 97 ]
    6차 정렬
    [ 19 5 31 55 59 61 63 89 94 97 ]
    7차 정렬
    [ 5 19 31 55 59 61 63 89 94 97 ]
    8차 정렬
    [ 5 19 31 55 59 61 63 89 94 97 ]
    9차 정렬
    [ 5 19 31 55 59 61 63 89 94 97 ]
    

    [자료구조] 정렬 - 작성중

    Bubble Sort(버블 정렬)
    출처 : 위키백과
    • 시간복잡도 : O(n^2)
    • 인접한 두 인자(즉, 2개씩) 비교해가며 반복하여 정렬
    • 장점 : 쉬운 구현
    • 단점 : 느리다.
    Insertion Sort(삽입 정렬)

    출처 : 위키백과
    • 시간복잡도 : O(n^2)
    • 앞에서 부터 차례대로 이미 정렬된 배열 부분과 비교하여, 알맞는 대소관계의 위치에 위치하여 정렬
    • 장점 : 쉬운 구현
    • 단점 : 배열이 길어질수록 

    Bucket Sort(버킷 정렬)
    • 인자들을 조건에 따라 분류를 하고 조건에 맞게 순서대로 정렬
    • 시간복잡도, 장,단점
      • 조건 마다 시간복잡도, 장단점 등이 다르기 때문에 정의 할수 없다.
    Merge Sort(합병 정렬,분할 정렬)
    • 인자들을 비슷한 크기로 나눠 비교하며 정렬
      • 2-Way Merge Sort -> 2개씩 나눠 정렬
    • 장점 : 큰 데이터 처리시 적은 RAM으로 나눠 정렬 가능
    Radix Sort(기수정렬)
    • 시간복잡도 : O(dn), d는 인자들중 가장 큰 자릿수
    • 낮은 자리수부터 비교해 가며 정렬
    • 장점 : 정렬속도가 매우 빠르다
    • 단점 : 메모리 크기가 많이 든다.

    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-- &gt; 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);
      

      2014년 8월 30일 토요일

      [Web HomePage,Java] 시간 포맷 - Service 부분

      개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
      사용 툴 : STS, MySQL Workbench 6.1 CE
      • ※저 스스로 로직과 테이블, jsp를 배우면서 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
      • 오늘 쓴 글이라면 오늘의 시간을, 아니라면 쓴 개시한 날자를 보여주기 Service 구현
      • △△△△△요런거△△△△△
      • 바로 코드 ㄱㄱ
      1
      2
      3
      4
      5
      6
      7
      8
      9
      Date = date;//비교값
      Date now = new Date(System.currentTimeMillis());
      now = DateUtils.truncate(now, Calendar.DATE);//오늘날짜
      if(date.compareTo(now) < 0){//비교값이 오늘날짜에 비하여 과거이면 -1반환,
       map.replace("b_date", new SimpleDateFormat("MM-dd").format(date));//month-day로 포맷
      }
      else if(date.compareTo(now) >= 0){//비교값이 오늘날짜(0시0분)에 비하여 미래, 즉 오늘 중 이라면 1을 반환
       map.replace("b_date", new SimpleDateFormat("HH:mm").format(date));//hour:minute로 포맷
      }