[APS] String

Bzeromo·2023년 8월 14일
0

APS

목록 보기
5/23
post-thumbnail

⚡ String


📌 문자의 표현

🔷 영어가 대소문자 합쳐서 52이므로 6비트면 모두 표현할 수 있다.

  • 이를 코드 체계라고 한다.
  • 숫자만을 저장하는 메모리에 맞춘 것
  • 네트워크가 발전하면서 지역마다 코드체계가 달랐던 탓에 서로간에 정보를 주고 받을 때 정보를 달리 해석한다는 문제가 생겼다. (미국)

🔷 ASCII(American Standard Code for Information Interchange)

  • 1967년 미국에서 제정된 문자 인코딩 표준

  • 7 bit 인코딩으로 128문자를 표현하며 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 이루어져 있다.

    💡 48 - 0, 65 - A, 97 - a 만 외워두자

char a = 'A'; // char 한 개는 외따옴표, 2바이트 크기이며 음수는 포함 X
		
System.out.println((int)'A'); // 명시적 형변환을 통해서 저장 가능
		
int b = 'A'; // 묵시적 형변환 (char는 2byte, int는 4byte라 가능)
System.out.println(b); // 65
		
System.out.println('9'-48); // '0'의 값을 빼면 문자를 실제 숫자처럼 사용할 수 있다.
System.out.println('7'-'0');
		
// 비트연산자로 대문자를 소문자로, 소문자를 대문자로 바꾸기
System.out.println((char)'A'^32); // XOR 연산
System.out.println((char)'a'^32); // XOR 연산

🔷 확장 아스키

  • 표준 문자 이외의 악센트 문자, 도형 문자, 특수 문자, 특수 기호 등 부가적인 문자를 128개 추가할 수 있게 하는 부호
  • 그런데 컴퓨터가 발전하면서 각 나라에서도 자국의 문자를 표현하기 위하여 코드체계를 만들어서 사용하게 되었다...

🔷 유니코드

  • 다국어 처리를 위해 마련한 표준
  • Character Set으로 분류

📌 문자열

🔷 String 클래스 사용(java)

  • 문자열 처리에 필요한 연산을 연산자, 메소드 형태로 제공한다.
  • -+. length(), replace(), split(), substring() 등

🔷 문자열 비교 및 배열 생성

// 문자열 생성
String str1 = "abc";
String str2 = new String("abc");
		
// 문자열 비교
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
		
String str3 = "abc";
String str4 = str2;
String str5 = str3;
		
System.out.println(str1 == str3); // 리터럴이기 때문에 true
System.out.println(str4 == str2); // 같은 주소 값이라 true
System.out.println(str3 == str5);
		
System.out.println(str1.equals(str3));
System.out.println(str2.equals(str4));
System.out.println(str3.equals(str5));
		
// "abc" -> 문자 배열
System.out.println(str3.charAt(1)); // 문자열의 요소를 하나씩 가져올 수 있다.
char [] c = str3.toCharArray(); // 문자열을 문자 배열로 만들어 반환한다.
System.out.println(Arrays.toString(c));

🔷 문자열 뒤집기

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 문자열 뒤집기
		String text = "소고기먹고싶다";
		
		// 1. 거꾸로 읽기
		char[] str = new char[text.length()];
		for(int i = text.length()-1, idx = 0; i >=0; i--, idx ++) {
			str[idx] = text.charAt(i);
		}
		System.out.println(Arrays.toString(str));
		
		// 2. swap
		char [] str2 = text.toCharArray();
		int len = str2.length;
		
		for(int i = 0; i < len/2; i++) {
			char temp = str2[i];
			str2[i] = str2[len-1-i];
			str2[len-1-i] = temp;
		}
		
		System.out.println(Arrays.toString(str2));
		
		// 3. StringBuilder / StringBuffer
		StringBuilder sb = new StringBuilder();
		sb.append(text);
		sb.reverse();
		System.out.println(sb);
	}
}

🔷 형 변환

String sNum = "1234";
String sNum2 = "  1234    ";
		
int num = Integer.parseInt(sNum); // int형으로 변환
int num2 = Integer.parseInt(sNum2.trim()); // 공백문자 제거
		
System.out.println(num);
System.out.println(num2);
		
String sNum3 = String.valueOf(num2); // int를 String으로 변환
		
System.out.println(atoi(sNum));

// 문자열 변환 동작원리 알아보기
// 문자열을 정수로 뒤바꾸기
public static int atoi (String text) {
	int value = 0;
	int digit = 0;
		
	// 앞에서부터 차례로 읽으면서 문자를 숫자로 바꾸고 자릿수 올리기
	for(int i = 0; i < text.length(); i++) {
		char num = text.charAt(i); // i번째 자리의 문자 읽기
		if(num >= '0' && num <= '9') {
			digit = num - '0';
		} // 숫자임을 확인하는 조건
		else {
			// 예외 처리
		}
	}
		
	value = (value*10)+digit;
		
	return value;
}

📌 패턴 매칭

🔷 고지식한 패턴 검색 알고리즘

  • 완전 검색(브루트포스)
  • 본문 문자열을 처음부터 끝까지 차례대로 순회하면서 패턴 내의 문자들을 일일이 비교하는 방식으로 동작
public class Main {
	public static void main(String[] args) {
		// 브루트 포스
		// 해당 패턴이 본문안에 들어있는가? 몇 번째 인덱스부터 시작하는가?
		String t = "This iss a book";
		String p = "iss";
		
		System.out.println(bruteForceFor(t, p));
	}

	public static int bruteForceWhile(String t, String p) {
		int N = t.length(); // 본문의 길이
		int M = p.length(); // 패턴의 길이
		
		int i = 0; // 본문의 index
		int j = 0; // 패턴의 index
		
		while(j < M && i < N) {
			if(t.charAt(i) != t.charAt(j)) {
				i -= j;
				j = -1;
			}
			i++;
			j++;
		}
		if(j==M)
			return i - M;
		
		return -1;
	}
	
	public static int bruteForceFor(String t, String p) {
		int N = t.length(); // 본문의 길이
		int M = p.length(); // 패턴의 길이
		
		for(int i =0; i < N-M+1; i++) {
			boolean flag = true;
			for(int j = 0; j < M; j++) {
				if(p.charAt(j) != t.charAt(i+j)) {
					flag = false;
					break;
				}
			} // 패턴 매칭을 수행하는 for문
			if(flag) {
				return i;
			}
		} // 패턴 검사의 시작점 위치
		
		return -1; // 못 찾았을 경우
	}
}

🔷 보이어 무어 알고리즘

  • 오른쪽에서 왼쪽으로 비교
  • 대부분의 상용 소프트웨어에서 채택하고 있는 알고리즘
  • 보이어-무어 알고리즘은 패턴에 오른쪽 끝에 있는 문자가 불일치 하고 이 문자가 패턴 내에 존재하지 않는 경우, 이동 거리는 무려 패턴의 길이 만큼이 된다.
profile
Hodie mihi, Cras tibi

0개의 댓글