2014년 9월 18일 목요일

java. java.lang.Scanner() methods

java lib '간단' 정리에 맛들렸다 ㅋㅋ
이번엔 최근 가장 많이 쓰는 것 중 하나인 Scanner().

- close(): 다 쓰고 나서 꼭 쓰자!
- next() / nextLine() / nextInt() 등등: 알지?
  - nextBigInteger() / hasNextBigInteger(): BigInteger()도됨
- radix() / useRadix(): 10진수인지 16진수인지 지수 return; / Radix 설정
- findInLine(pattern): 패턴에 맞는거 return. delimiter 무시함. - findWithinHorizon() = findWithinHorizon(Pattern.compile(pattern, horizon))
- locale() / useLocale(): input의 언어정보 출력 /  언어 설정
추가로.. 설명이 필요한 몇 개.
- delimiter() / useDelimiter() / skip(): 구분자(패턴) 설정. / skip은 무시하는 구분자 설정.
     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 
- match(): MatchResult 출력
public class ScannerDemo {

   public static void main(String[] args) {

      String s = "Hello World! 3 + 3.0 = 6 ";

      // create a new scanner with the specified String Object
      Scanner scanner = new Scanner(s);

      // check if next token is "Hello"
      System.out.println("" + scanner.hasNext("Hello"));

      // find the last match and print it
      System.out.println("" + scanner.match());

      // print the line
      System.out.println("" + scanner.nextLine());

      // close the scanner
      scanner.close();
   }
}
결과:
 
true
java.util.regex.Matcher[pattern=Hello region=0,25 lastmatch=Hello]
Hello World! 3 + 3.0 = 6 

-

Ubuntu 14.04 썰

Ubuntu 14.04를 사용하면서 필요했던 것, 불편한 것들을 나열해본다.
경험상 안되는 것은 많이 없다. 꼭 필요한 것은 간단하게 구현해서 사용하도록.

PROS.
>한글 입력 문제.
  • 다들 동일한 문제로 고민하는데 ibus는 오류가 많다.
  • ibus 오류들:
  • 맞춤법 검사 안됨. 한타는 무조건 빨간줄
  • 타자를 치다가 마우스를 특정 위치에 클릭하면 마지막 글자가 마우스 포인터 위치에 입력됨 -_-;;
  • 한/영키로 한영 전환을 하려면 dconf등을 이용해 수정해야 함.

>onenote와 같은 메모 프로그램..
  • nix note나 저널 같은걸로 대충 쓸 수는 있지만 매우 아쉽다.
  • web base의 google keep으로 대체하고는 있지만 pen 역할을 할 수 있는게 없네 -_-;;

>UI
  • 반응이 유기적이지 못하고 끌리는 듯한 느낌을 지울 수 없다.

>기타
  • 많은 부분이 shell이 없으면 할 수 없는 것 들이 있다. 물론 배포된 프로그램들에는 매뉴얼이 항상 있는 것도 신기함.
  • 리눅스 지식이 없으면 쓰기 힘들다
  • 필요한 것들이 리눅스로 만들어 진 것들이 많이 없어서 할수없이 만들어서 사용해야 한다.
  • 윈도우에서 누리던 모든 것들이 부럽다. 그냥 윈도우를 쓸까 생각한 적이 한두번이 아니다.
CONS.
>개발 편의
  • 개발자들에게는 여러가지로 편함. 확장성 짱임
  • 무료 무료 모두 무료!

결론. 공짜 OS에 바라는게 많다고 할 수 있지만 아직 불편하다.

2014년 9월 17일 수요일

Algorithm. Scanning(스캐닝) algorithm

algospot의 MAXSUM 문제:
scanning algorithm을 사용해야 함. scanning algorithm은 기본 concept는
--> '최대값 계산 시, 음수가 포함된다면 잘라내기'
라고 요약할 수 있겠다.

먼저 내가 작성한 source를 보자
package com.yongk.algospot.MAXSUM;

import java.util.Scanner;

public class MAXSUM {
 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  int T = Integer.parseInt(sc.nextLine());
  while(T-- > 0) {
   int N = sc.nextInt();
   sc.nextLine();
   int[] input = new int[N];
   String[] temp = sc.nextLine().split(" ");
   for (int i = 0; i < N; i++) {
    input[i] = Integer.parseInt(temp[i]);
   }
   System.out.println(getMaximumSetFast(input));
  }
  sc.close();
 }
 private static int getMaximumSetFast(int[] input) { //scanning algorithm
  int max = 0;
  int from = 0;
  for (int i = 0; i < input.length; i++) {
   from = Math.max(from + input[i], 0);
   max = Math.max(max, from);
  }
  return max;
 }
 private static int getMaximumSetSlow(int[] input) { //처음 생각한 O(n^2)의 저속한 algorithm
  int[] sum = new int[input.length];
  sum[0] = input[0];
  int max = 0;
  for (int i = 1; i < input.length; i++) {
   sum[i] = sum[i - 1] + input[i];
   max = Math.max(max, sum[i]);
  }
  
  for (int i = 0; i < sum.length; i++) {
   for (int j = i; j < sum.length; j++) {
    max = Math.max(max, sum[j] - sum[i]);
   }
  }
  return max;
 }
}

- 처음 생각한 것이 getMaximumSetSlow()인데 나름 짱구를 굴려 미리 계산한 값으로 중복 계산을 줄이자는 생각이었지만 미개한 생각이었다.
- getMaximumSetFast()가 scanning algorithm. input[0]에서부터 더해가다가 그 값이 0보다 작아지면 당연히 거기까진 더할 필요가 없다. 왜냐하면 거기서부터 더하는건 0보다 크기 때문.
- 덕분에 scanning algorithm은 O(n)의 속도이다.
- 사람도 이렇게 생각하지 않을까?

덧1, python으로 같은 것을 구현하면
import sys 
def getMaximumSetFast(input):
        maxVal = 0 
        fromVal = 0 
        for i in input:
                fromVal = max(fromVal + i, 0)
                maxVal = max(fromVal, maxVal)
        return maxVal

rl = lambda: sys.stdin.readline()
T = int(rl())
for i in range(T):
        rl()
        input = [int(j) for j in rl().split()] 
        print(getMaximumSetFast(input))

덧2. 그리고 java.util.Scanner()는 느리다..대따 느리다 ㅠㅠ 가급적이면 nextInt()보다는 nextLine()을 parseInt()할 것! 처음엔 다음과 같이 작성했었는데..참담한 속도였다. 적어도 5배 이상 느림.
  while(T-- > 0) {
   int N = sc.nextInt();
   int[] input = new int[N];
   for (int i = 0; i < N; i++) {
    input[i] = sc.nextInt(); //slow!!!
   }
   System.out.println(getMaximumSetFast(input));
  }


'no branches ready for upload' 발생시 대처법

checkout 하면 upload 하려고 할 때 다음 error가 발생한다.
no branches ready for upload
해결책:
  - 요지는 'branch를 새로 생성해서 upload 하면 됨'
  - 예시
    $ git branch -b for_upload
    $ repo upload .
간단하지? ㅋㅋ

java. java.lang.Math methods

아주 간략화하여 기억하기 쉽도록 정리해보자!

- abs(x) = |x|
- cbrt() / sqrt(): cube root / square root
- ceil() / round() / floor(): 올림 / 반올림 / 버림
- exp(n) = e^n
- expml() = e^x - 1
- hypot(x, y) = sqrt(x^2, y^2)
- log(x) = ln(x)
- max() / min(): 최대 / 최소값
- pow(): 제곱수
- random(): 랜덤값
- scalb(x,n) = x^n
- signum(x): 0.0(x=0), 1.0(x>0), -1.0(x<0 br="">- toDegrees() / toRadians(): 라디안을 각도로 / 각도를 라디안으로
- 삼각함수: cos() sin() tan() 등과 acos()(아크코사인) 등등

참고 page: http://java.lang.math/

Algorithm. 실수 연산

프로그래밍 중 실수 연산이 문제가 되는 경우가 왕왕 있음.

오늘도 algorithm 문제 풀다 한번 위기에 봉착해서 오답노트겸 적어놓는다.

package com.yongk.algospot.RATIO;
import java.util.Scanner;

public class RATIO {

 public static void main(String[] args) {
  Scanner sc = new Scanner(System.in);
  int T = Integer.parseInt(sc.nextLine());
  while(T-- > 0) {
   long N = sc.nextLong();
   long M = sc.nextLong();
   System.out.println(getMinimumTick(N, M));
  }
 }

 private static long getMinimumTick(long N, long M) {
  
  long Z = (long)(1 + M * 100 / N);
  if (Z >= 100) return -1;
  return (long)Math.ceil((Z * N - 100 * M) / (100 - Z));

 }
}
위에서 틀린 것을 찾아보면..
Math.ceil에 들어가는 인자가 long으로 연산되어 double로 cast 되어 Math.ceil에 입력됨.
 private static long getMinimumTick(long N, long M) {
  
  long Z = (long)(1 + M * 100 / N);
  if (Z >= 100) return -1;
  return (long)Math.ceil((double)(Z * N - 100 * M) / (100 - Z));

 }
로 변경이 필요하다. 별 것 아닌데 개고생함.

결론:
1. 가급적이면 실수 연산을 정수 연산에 섞지 않고
2. 섞어야 한다면 캐스팅 반드시 할 것

2014년 9월 1일 월요일

python과 java

하도 파이선으로 스크립팅 하는 것들이 많아 궁금하기도 의무감도 들어서 검색을 하고 좀 봤는데..
한 마디로 요약하자면 매우 게으르고 발전된 언어인 것 같다.
C로 프로그래밍을 시작하고 자바를 접하면서 발전된 언어라는 것을 느꼈는데
파이선은 그보다 더 발전한 언어인것 같다
인상깊었던 것은
ㅡ 튜플
ㅡ 간단한 string 편집.. 구아바랑 비교를 함 해봐야 할 듯..
ㅡ 간단한 함수 모듈 클래스 등등 oop 구현
ㅡ 간단한 간단한 간단한.. 불필요한 반복적인 문구들 다 간단함.
ㅡ 리턴이 있는지 보이드인지도 선언 안해도 알아서 됨
진짜 게으른 언어다. 짱인듯. Pydev 설치해노코 익숙해지는것만 남았다. 되게쉽네 진짜..