[Java] 알고리즘_문자열

이광훈·2023년 7월 18일
0

알고리즘

목록 보기
1/4

✅ 문자열 ▶️ 숫자 변환

💡 동작 방식

  1. ASCII 코드표에서 '0'의 값은 48임
  2. 문자열의 한글자씩 char형으로 가져온 뒤, 48을 빼주면 0~9 사이의 숫자가 나옴
  3. 결과를 수집해서 int형 변수에 할당

🚧 예시 코드

public class AlphaToInteger {
	public int atoi(String Value) {
    	int result = 0;
        // 첫번째 문자 확인 (마이너스 구분)
        boolean negative = false;
        int i = 0;
        if (value.charAt(i) == '-') {
        	// 맞다면 미리 기록
            negative = true;
            // 두번째 글자부터 확인
            i++;
       	}
        
        // 문자열을 한글자(한자리)씩 확인
        for (; i < value.length(); i++) {
        	// 자릿수 변환
            result *= 10;
            // 글자를 숫자로 변환
            result += value.charAt(i) - 48;
       	}
        if (negative) result *= -1;
        return result;   
   	}
    
    public static void main(String[] args) {
        AlphaToInteger atoi = new AlphaToInteger();
        System.out.println(atoi.atoi("12345") + atoi.atoi("-4291"));
        System.out.println(atoi.atoi("-4291"));
        
    }
}

✅ 문자열 ▶️ 숫자 변환

💡 동작 방식

  1. 숫자를 문자로 표현할 때, 기본적으로 한자리씩 표현해야함
  2. '0'을 표현한 문자는 ASCII 코드 상의 48의 값을 가지고 있음
  3. 48에 각 자리수를 더하면 해당 수를 표현한 ASCII 코드 값이 나옴

🚧 예시 코드

public class IntegerToAlpha {
	public String itoa(int value) {
    	StringBuilder answer = new StringBuilder();
        // 음수인지 확인
        boolean negative = false;
        if (value < 0) {
        	value *= -1;
            negative = true;
        }
        
        while (value > 0) {
        	// value를 10으로 나눈 나머지를 문자로 변환
            char digitChar = (char)(value % 10 + '0');
            answer.append(digitChar)
            
            // value 나누기 10
            value /= 10;
      	}
        return answer.reverse().toString();
  	}
    
    public static void main(String[] args) {
        IntegerToAlpha itoa = new IntegerToAlpha();
        // 123456789
        System.out.println(itoa.itoa(1234) + itoa.itoa(56789));
    }
}

✅ 패턴 매칭_Brute Force

👉 본문 문자열의 특정 위치부터, 패턴 문자열과 완전히 일치하는지 비교후, 일치하지 않는다면 다음 위치에서 비교하여 검증하는 방식

💡 동작 방식

  1. target 문자열과 pattern 문자열의 위치를 저장하는 ij를 지정
  2. target[i]pattern[j]가 일치할 경우, i++, j++를 함
  3. target[i]pattern[j]가 불일치할 경우,
    a. i = i - j를 할당 후 i++를 진행 → i - j부터 찾는데 실패했기 때문에,
    i - j + 1부터 다시 찾기 위해서
    b. j = 0을 할당 → 패턴의 청므부터 다시 검증해야 하기 때문
  4. j의 크기가 pattern의 길이만큼 커지면, pattern을 찾는데 성공

🚧 예시 코드

public class BFPatternMatching {
	public void solution() throws IOException {
    	BufferedReader reader 
        			= new BufferedReader(new InputStreamReader(System.in));
        String target = reader.readLine();
        String pattern = reader.readLine();
        
        int tarIdx = 0;
        int patIdx = 0;
        
        while (tarIdx < target.length() 
        		&& patIdx < pattern.length()) {
        	// target[tarIdx]가 pattern[patIdx]랑 다를 경우
            if (target.charAt(tarIdx) != pattern.charAt(patIdx)) {
            	// tarIdx를 여태까지 이동한만큼 되돌림
                // 시작점 원위치, 맞았던 만큼 돌아감
                tarIdx -= patIdx;
                // 다음에 패턴의 첫 위치를 다시 찾기위해 -1로 초기화
                patIdx = -1;
           	}
            
            // 다음칸으로 이동
            tarIdx += -1;
            patIdx += -1;
       	}
        
        // patIdx == patter.length()이면 성공 -> 어디에서 찾았는지 출력
        if (patIdx == pattern.length()) {
        	System.out.println(tarIdx - patIdx);
       	} else {
        	System.out.println("404 Not Found");
      	}
  	}
    
    public static void main(String[] args) throws IOException {
    	new BFPatternMatching().solution();
   	}
}
profile
웃으며 일할 때, 시너지가 배가 된다고 믿는 개발자

0개의 댓글