sm 기술 블로그

143. 16139(인간-컴퓨터 상호작용) - 자바 본문

문제/백준_자바

143. 16139(인간-컴퓨터 상호작용) - 자바

sm_hope 2022. 7. 14. 22:48
import java.util.*;
import java.io.*;

class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String S = br.readLine();
		int q = Integer.parseInt(br.readLine());
		int[] alphabetTmp = new int[26];
		int[][] alphabet = new int[S.length()][26];
		
		for (int i = 0; i < S.length(); i++) {
			alphabetTmp[S.charAt(i) - 'a']++;
			for (int j = 0 ; j < 26; j++) {
				alphabet[i][j] = alphabetTmp[j];
			}
		}

		for (int i = 0; i < q; i++) {
			String[] sBits = br.readLine().split(" ");
			char a = sBits[0].charAt(0);
			int l = Integer.parseInt(sBits[1]);
			int r = Integer.parseInt(sBits[2]);

			int tmp = 0;

			tmp = alphabet[r][a - 'a'];

			if (l != 0) {
				tmp -= alphabet[l - 1][a - 'a'];
			}

			sb.append(tmp).append("\n");
		}
		

		System.out.print(sb);
		
	}
}

문제요약

문자열에서 정해진 구간에 특정 문자가 몇개 있느냐?

설명

단순히 들어온 케이스마다 반복문으로 문제를 푼다면 100점을 맞을 수 없다.

 

카운팅정렬과 비슷하게 알파벳 26개를 지니는 배열을 정의하고 문자열의 각 문자에 대해 인덱스 값을 증가시켜 주어 처리한다.

 

글 만으로는 이해가 어려우니 표를 보자.

다음과 같이 seungjaehwang이 들어왔을 때, 각 문자에 해당되는 index는 위와같은 배열을 갖고 있다.

 

		for (int i = 0; i < S.length(); i++) {
			alphabetTmp[S.charAt(i) - 'a']++;
			for (int j = 0 ; j < 26; j++) {
				alphabet[i][j] = alphabetTmp[j];
			}
		}

이 코드를 통해서 위와같은 표를 만들 수 있는 것이다.

(값을 하나하나 넣어줘야 한다. 배열을 바로 덮어 씌우는 방법도 있지만 그러면 주소를 참조하여 값이 바뀌면 전에 넣었던 값도 같이 바뀐다.)

 

		for (int i = 0; i < q; i++) {
			String[] sBits = br.readLine().split(" ");
			char a = sBits[0].charAt(0);
			int l = Integer.parseInt(sBits[1]);
			int r = Integer.parseInt(sBits[2]);

			int tmp = 0;

			tmp = alphabet[r][a - 'a'];

			if (l != 0) {
				tmp -= alphabet[l - 1][a - 'a'];
                //누적합 이기때문에 -1을 해준다.
			}

			sb.append(tmp).append("\n");
		}

본격적으로 입력값에 대한 처리를 한다.

a는 문자 , l은 시작 구간, r은 끝 구간이다.

끝구간(r)에 입력 받은 문자(a) 의 인덱스에 해당되는 값을 가져온다.

 

주의) 0부터 처리한것이다. 만약 시작구간이 0번째가 아니라면 시작위치를 -1로 해준다.(누적합)

'문제 > 백준_자바' 카테고리의 다른 글

145. 11660(구간 합 구하기 5) - 자바  (0) 2022.07.16
144. 10986(나머지 합) - 자바  (0) 2022.07.16
142. 2559(수열)  (0) 2022.07.12
141. 11659(구간 합 구하기4) - 자바  (0) 2022.07.11
140. 12865(평범한 배낭)  (0) 2022.07.11
Comments