알고리즘(BOJ)/Silver

백준 - 타이핑 25215 (다이나믹)

ch.0 2023. 3. 25. 10:39


문제 분석

직관적으로 문제에 접근하는 게 오히려 쉽게 풀렸다.
처음에는 1부터 size-1까지 해결한 후 처음과 마지막 문자열에 대한 처리를 하려고 했으나 경우의 수가 너무 많았다.
문제에 나온 것처럼 상태(◇눌린 상태인지), 현재, 다음 의 문자의 대/소문자여부를 파악하여 처리했다.
현재 소문자일 때, 소문자상태면 더 볼 것도 없이 하나의 입력만 필요하다.
현재 소문자일 때, 대문자상태면 무조건 두 개의 입력이 필요하다. 하지만 여기서 다음 문자가 소문자라면 ☆을 입력해 준 것일 테니까 대문자 상태여부는 바꿔주지 않는다
현재 대문자일 때, 대문자상태면 더 볼 것도 없이 하나의 입력만 필요하다.
현재 대문자일 때, 소문자상태면 무조건 2개의 입력이 필요하다.위에서 반대로 다음 문자가 대문자면 ☆을 입력해 준 것일 테니까 대문자 상태여부는 바꿔주지 않는다.

 

 

 

 

전체 소스

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		int[] array = new int[input.length()];
		
		
		
		//대문자 65~90 소문자97~122
		
		for(int i=0; i<input.length(); i++) {
			int c = input.charAt(i)-0;
			array[i] = c;
		}
		
	
		
		int result = 0;
		boolean check = false;
		for(int i=0; i<input.length(); i++) {
			
			//소문자 
			if(array[i]>96) {
				// 대문자였던 상태라면 
				if(check) {
					if(i+1<input.length() && array[i+1] > 96) {
						check = false;
					}
					result += 2;
				}else {
				result++;
				}
				//대문자 
			}else if(array[i]<91) {
					// 소문자였던 상태라면 
					if(!check) {
						if(i+1<input.length() && array[i+1] < 91) {
							check = true;
						}
						result += 2;
					}else {
					result++;
					}
				}
			
			
			
		}
	
		

		
		System.out.println(result);
		
	}

}


https://www.acmicpc.net/problem/25215

 

25215번: 타이핑

민겸이는 영어 소문자와 대문자로 이루어진 문자열을 타이핑하기로 했다. 민겸이가 사용할 수 있는 버튼은 26개의 영어 알파벳 버튼과 마름모(◆) 버튼, 별(★) 버튼이다. 각 버튼은 아래와 같이

www.acmicpc.net

 

문제