[Algorithm] String (02/17)

박세윤·2023년 2월 17일
0

Algorithm

목록 보기
5/24
post-thumbnail

📖 String

📌 문자열


✅ 문자의 표현

  • 컴퓨터에서 문자 표현

    • 각 문자에 대해서 대응되는 숫자를 정해 놓고 이것을 메모리에 저장하는 방식 사용
  • 1967년, 미국에서 ASCII 라는 문자 인코딩 표준 제정

    • 7bit로 표현 가능
  • 확장 아스키는 굳이 몰라도 됨



✅ ASCII의 문제점

  • 국가간 정보를 주고 받을 때 아스키에 문제가 생겼다.

  • 자국의 코드체계를 타 국가가 가지고 있지 않으면 정보를 잘못 해석 할 수 밖에 없었다.

  • 다국어 처리를 위한 표준을 마련했다.

    • 유니코드
      • 지구상의 모든 문자 표현 가능.
    • 32bit, 4byte



✅ 유니코드

  • 다시 Character Set으로 분류된다.

  • 기존 유니코드의 표준인 UCS-2나 UCS-4는 유니코드를 저장하는 변수의 크기를 정의하지만 바이트 순서에 대해 표준화 하지 못했고, 적당한 외부 인코딩이 필요하게 되었다.



✅ endian

  • big-endian

  • little-endian



✅ 유니코드 인코딩 (UTF - Unicode Transformation Format)

  • UTF-8

  • UTF-16 (Java)

  • UTF-32



✅ 문자열의 분류

문자열(String)

  • fixed length (고정 길이)

  • variable length (가변 길이)

    • length controlled : java 언어에서의 문자열 - 길이 정보
    • delimited : c 언어에서의 문자열 - 널문자 사용



    ✅ C와 Java의 String 처리의 기본적인 차이점

  • c는 아스키 코드로 저장

  • java는 유니코드(UTF16, 2byte)로 저장

  • 파이썬은 유니코드(UTF8)로 저장



    ✅ 문자열 뒤집기

  • 자기 문자열에서 뒤집는 방법

    • swap을 위한 임시 변수 필요
    • 반복 수행을 문자열 길이의 *만 수행
  • 새로운 빈 문자열을 만들어 소스 부터 읽어서 타겟에 쓰는법

  • StringBuffer의 reverse() 메소드 쓰면 되긴하는데 StringBuilder나



    ✅ 문자열 비교

  • Java에서는 equals() 메소드 제공

    • 문자열 비교에서 == 연산은 메모리 참조가 같은지 묻는 것



    ✅ 문자열 숫자를 정수형으로 변환

  • 숫자 클래스의 parse 메소드

    • ex> Integer.parseInt(String)
    • 역함수 : toString()



✅ 자바에서 atoi() 구현

  • 원래는 c언어 함수임
int atoi(char[] charArr) {
	int value = 0;
    int digit;
    
    for(int i=0; i<charArr.length; i++) {
    	if(charArr[i] >= '0' && charArr[i] <= '9')
        	digit = charArr[i] - '0';
       	else
        	break;
    	
        value = (value * 10) + digit;
    }
    return value;
}



📌 패턴 매칭

✅ 패턴 매칭에 사용되는 알고리즘들

  • 고지식한 패턴 검색 알고리즘 (Brute Force)

  • 카프-라빈 알고리즘

  • KMP 알고리즘

  • 보이어-무어 알고리즘

고지식한 패턴 검색 알고리즘(브루트포스) 빼고 세 가지는 이런게 있다만 알면 된다.



✅ for문을 활용한 브루트포스

public class For문을활용한브루트포스 {
	public static void main(String[] args) {
		char[] original = "My name is Se Yun".toCharArray();
		char[] part = "Yun".toCharArray();
		
		int idx = BruteForceFor(original, part);
		
		System.out.println(idx);
	}
	
	public static int BruteForceFor(char[] original, char[] part) {
    // pattern이 한 칸씩 shift하는데 그걸 최대 n-m+1번 수행 여기선 17 - 3 + 1 = 15
		for(int i=0; i<original.length - part.length + 1; i++) {
			boolean flag = true;
			
			for(int j=0; j<part.length; j++) {
				if(original[j+i] != part[j]) {
					flag = false;
					break;
				}
			}
			
			if(flag)
				return i;
		}
		
		return -1;	
	}
}



✅ while문을 활용한 브루트포스

public class While문을활용한브루트포스 {
	public static void main(String[] args) {
		char[] original = "I am 26 years old".toCharArray();
		char[] part = "26".toCharArray();
		
		int idx = BruteForceWhile(original, part);
		
		System.out.println(idx);
	}
	public static int BruteForceWhile(char[] original, char[] part) {
		int i = 0;
		int j = 0;
		
		while(i < original.length && j < part.length) {
			if(original[i] != part[j]) {
				i -= j;
				j -= 1;
			}
			i++;
			j++;
		}
		
		if(j == part.length)
			return i - j;
		else
			return -1;
	}
}



profile
개발 공부!

0개의 댓글