공부방

String 본문

알고리즘/List

String

코딩 화이팅 2023. 2. 17. 13:32

문자로 정수형 나타내기

package test1;

public class test1 {
	public static void main(String[] args) {
		int zero = '0' - '0';
		int one = '1' - '0';
		int two = '2' - '0';
	}
}

문자열(String)로 숫자 입력받고 숫자(Int) 배열로 나타내기

package test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

import org.omg.CosNaming.IstringHelper;

public class test2 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String str = br.readLine();
		char[] arr = str.toCharArray();
		for (int i = 0; i < arr.length; i++) {
			int num=arr[i]-'0';
			System.out.println(num);
		}
	}
}
//
1234
1
2
3
4
1234는 문자열
1
2
3
4
는 정수형

문자열->정수형

정수형->문자열

package test1;

public class test3 {
	public static void main(String[] args) {
		// atoi : 문자열 => 정수
		int num = atoi("1234");
		System.out.println(num);

		// itoa : 정수 => 문자열
		String str = itoa(4321);
		System.out.println(str);
	}

	private static String itoa(int value) {
		StringBuilder sb = new StringBuilder();
		int tmp = value;
		while (tmp > 0) {
			char c = (char) (tmp % 10 + 48); // 각 숫자에다가 48을 더해줘야 그 숫자의 문자코드가 됨
			sb.append(c);
			tmp /= 10; // 그 다음자리로 넘어간다.
		}

		return sb.reverse().toString();
	}

	private static int atoi(String string) {
		char[] arr = string.toCharArray();
		int value = 0;

		int digit;
		// 음수인 경우에는 '-' 이 있는지 여부를 체크한다.

		for (int i = 0; i < arr.length; i++) {
			if (arr[i] >= '0' && arr[i] <= '9')
				digit = arr[i] - '0';
			else
				break;
			value = (value * 10) + digit;

		}
		return value;
	}
}

문자열 뒤집기

package test1;

import java.util.Arrays;

public class test4 {
	public static void main(String[] args) {
		//문자열 뒤집기
		
		//1.swap
		String str="싸피";
		char[] arr=str.toCharArray();
		//길이의 반만큼만 반복
		for (int i = 0; i < arr.length/2; i++) {
			//swap
			char temp=arr[i];
			arr[i]=arr[arr.length-1-i];
			arr[arr.length-1-i]=temp;
		}
		System.out.println(Arrays.toString(arr));
		//문자열의 배열->문자열
		String str2=String.valueOf(arr);
		System.out.println(str2);
		
		//2. 새로운 배열을 만들어서 거꾸로
		StringBuilder sb=new StringBuilder();
		for (int i = arr.length-1; i >=0; i--) {
			sb.append(arr[i]);
		}
		System.out.println(sb.toString());
		
		//3. StringBulider
		sb.reverse();
	}
}

패턴 매칭 : 고지식한 패턴 검색 알고리즘

본문 문자열을 처음부터 끝까지 차례대로 순회하면서 패턴 내의 문자들을 일일이 비교하는 방식으로 동작

package test2;

public class test1 {
	public static void main(String[] args) {
		char[] t = "This iss a book".toCharArray();//문자열을 바로 문자 배열로 만들어줌.
		char[] p = "iss".toCharArray();
		
		int idx = BruteForceFor(p, t);
		System.out.println(idx);
		idx = BruteForceWhile(p, t);
		System.out.println(idx);
	}

	private static int BruteForceWhile(char[] p, char[] t) {
		int n = t.length;
		int m = p.length;
		
		int i = 0;
		int j = 0;
		
		while(j < m && i< n ) {
			if(t[i] != p[j]) {
				i -= j;
				j = -1;
			}
			i++; j++;
		}
		// while문이 끝났다는 것은?
		// 1. j == m => 찾은 상황
		// 2. j != m => 못찾은 상황
		
		if(j==m) return i - m;
		else return -1;
	}

	private static int BruteForceFor(char[] p, char[] t) {
		int n = t.length;
		int m = p.length;
		
		for(int i=0; i<n-m+1; i++) { // pattern이 한 칸씩 shift가 최대 n-m+1번 수행
			boolean flag = true; // 각 shift에서 일단 일치한다고 가정하고 비교를 시작
			for(int j=0; j<m; j++) { // 각 shift에서 1:1 비교가 최대 m번 수행
				if(p[j] != t[i+j]) { // 일치하지 않는게 발견되면
					flag = false; // 일치하지 않는다고 바꾼다
					break;
				}
			}// 다 돌았을 때 flag => true : 모두 일치
			// flag => false : 모두 일치 X
			if(flag) return i;
		}
		
		return -1;
	}
}
//
5
5
//혼자 복습
public class 나홀로패턴검색 {
	public static void main(String[] args) {
		char[] t="fhkviaieabviaaoihohviaf".toCharArray();
		char[] p="via".toCharArray();
		
		int a= BruteForce(t, p);
		
		System.out.println(a);
		
		
	}
	
	public static int BruteForce(char[] t, char[] p) {//패턴 검색 메서드
		int n=t.length;//찾아질 문장의 길이
		int m=p.length;//찾을 단어의 길이
		int count=0;//찾은 수 만큼 더해줄 변수
		for (int i = 0; i < n-m+1; i++) {//찾을 문장의 길이에서 찾을 단어의 길이만큼
			//뺀 후 1을 더한 배열의 인덱스까지 찾을 것
			boolean check=true;//일단 다들 일치한다고 가정
			for (int j = 0; j < m; j++) {//찾아질 단어가 길이가 m이고 그 단어만큼 찾을 것이기 때문에
				if (p[j]!=t[i+j]) {//만약 맞지 않는 곳을 찾았다면 그곳은
					check=false;//일치하지 않는 곳이기 때문에 false입력
				}
			}
			if (check) {//전체에서 일치하지 않는 곳들은 다 false이기 때문에
				//21번 라인에서 걸러지지 않은 것들은 다 자동으로 true가 된다.
				count++;//그 걸러지지 않은 곳들만큼 카운트 하나씩 더해준다.
			}
		}
		return count;//메서드의 끝에서 int이기 때문에 센 count를 return
	}
}

'알고리즘 > List' 카테고리의 다른 글

2차원 배열, 카운팅 정렬  (0) 2023.02.16
완전검색, 그리디  (0) 2023.02.15
정렬  (0) 2023.02.14
배열  (0) 2023.02.13