레이블이 python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 python인 게시물을 표시합니다. 모든 게시물 표시

2014년 9월 30일 화요일

python. 문자열


문자열 조작 / list 조작 / split() / join() / strip() / find() / %(forma) 설명..
FIXME: 예제 추가

문자열 조작:
  • a[start:end:shift]
  • repr(): 문법 내에 표현들을 문자열로 표현해줌. 예를들면, 배열이나 숫자, 함수 등. 아무거나 넣으면 error exception

list 조작:
  • documentation의 string section 참고..너무많다.

자르기:
  • split(): 나누기
  • join(): 합치기

삭제:
  • strip(): 원래 문자열에서 공백(arg가 있으면 문자) 제거
  • lstrip(): 원래 문자열에서 왼쪽 여백 제거
  • rstrip(): 원래 문자열에서 오른쪽 여백 제거
--> 여기서 공백/여백은 string.whitespace variable에서 확인 가능함.

치환:
  • replace(): 치환
  • maketrans() / translate():강력한 치환..

검색:
  • find(): 첫 번째 substring의 string에서의 index, 없으면 -1
  • rfind(): reverse find()
  • index() / rindex(): find와 동일하지만 substring이 없으면 -1이 아니라 error return
  • count(): substring이 몇 번 있는지
  • startswith() / endswith(): 시작과 끝을 검색하고 boolean return

format:
  • "xxx{0}yyy{1}".format(":", ";") --> xxx:yyy;
  • 0, 1 등의 정수 대신에 dict 표현도 가능함
  • "%s: test" % "yongk" --> yongk: test
참고: http://lapee79.blogspot.kr/2013/08/python-strings.html

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));
  }


2014년 9월 1일 월요일

python과 java

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