CS/Baekjoon

[Algorithm] 백준 단계별로 풀어보기 - 단계 7. 문자열

칸타탓 2019. 4. 17. 15:45

BaekJoon Oline Judge - Step 7

11654. 아스키코드

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String c = scan.next();
		scan.close();
		
		int res = c.charAt(0);
		
		System.out.println(res);
	}
}

 

10809. 알파벳 찾기

배열을 -1로 모두 초기화해주고, 알파벳 소문자의 개수만큼 배열 생성

a부터 시작하므로, a의 아스키 값인 97을 뺀 곳에 문자가 처음 등장하는 index를 넣는다.

두번 등장할 때 배열을 덮어쓰면 안되기 때문에 -1일 때만 값 넣어주기!

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String S = scan.next();
		scan.close();
		
		int [] arr = new int[26];
		Arrays.fill(arr, -1);
		
		for(int i=0; i<S.length(); i++) {
			int ascii = S.charAt(i);
			if(arr[ascii-97] == -1) {
				arr[ascii-97] = i;
			}
		}

		for(int val : arr){
		    System.out.print(val+" ");
		}
	}
}

 

2675. 문자열 반복

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		
		for(int i=0; i<N; i++) {
			int R = scan.nextInt();
			String S = scan.next();
			
			String str = "";
			for(int m=0; m<S.length(); m++) {
				for(int n=0; n<R; n++) {
					str = str + S.charAt(m);
				}
			}
			System.out.println(str);
		}
		scan.close();
	}
}

 

1316. 그룹 단어 체커

알파벳 소문자 26개를 배열로 선언하고 false로 모두 초기화한다. (i가 증가할 때마다 배열 초기화 해줘야함!)

문자를 입력받고 그 문자의 길이-1 만큼 반복문을 돌린다.

before(i), after(i+1)의 문자가 같다면 같은 배열의 index이므로 둘 중 하나인 after만 true로 바꾸어준다.

만약 두개가 다르다면 체크해주어야 할 것이 있는데, 이미 그 앞에 알파벳이 존재해서 true로 바뀌었는지다.

이미 있던 알파벳이면(true이면) false로 바꿔주고, flag를 증가시킨다.

 

같은 알파벳이 떨어져서 존재하면 그룹 단어가 아니므로, flag가 0이 아니라면 그룹단어의 갯수를 증가시키지 않는다.

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
	
		boolean [] checker = new boolean[26];
		int groupCnt = 0;
		for(int i=0; i<N; i++) {
			String word = scan.next();
            
			int flag = 0;
			Arrays.fill(checker, false);
			
			for(int j=0; j<word.length()-1; j++) {
				int beforeAscii = word.charAt(j);
				int afterAscii = word.charAt(j+1);
				
				if(beforeAscii == afterAscii) { //같은 경우
					checker[afterAscii-97] = true; //둘 중 하나 after만 담는다.
				} else { //다른 경우
					//after가 이미 true(앞에 있던 수)인지 체크하고 이미 있던 알파벳이면 false로 바꾼다.
					if(checker[afterAscii-97] == true) {
						checker[afterAscii-97] = false;
						flag += 1;
					} else {
						checker[beforeAscii-97] = true;
						checker[afterAscii-97] = true;
					}
				}
			}
			if(flag == 0) {
				groupCnt++;
			}
		}
		scan.close();
		System.out.println(groupCnt);
	}
}

 

1157. 단어 공부

알파벳 갯수만큼 배열을 만든다. 대소문자를 구분하지 않기 때문에 배열의 크기는 26이다.

a = 97, A = 65

97과 65가 들어왔을 때는 같게 취급해야 한다. 그렇기 때문에 대소문자간의 차인 32를 더해주었음.

 

그 다음은 알파벳 찾기 문제와 동일하다.

알파벳 위치의 index를 증가시키고 가장 큰 값을 가지고 있는 index에 65를 더해 대문자 문자로 출력하면 됨!

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String word = scan.next();
		scan.close();
		
		int [] arr = new int[26];
		
		for(int i=0; i<word.length(); i++) {
			int ascii = word.charAt(i);
			if(ascii < 97) {
				ascii = ascii + 32;
			}
			arr[ascii-97]++;
		}
		
		int max = 0, maxIndex = 0;
		for(int i=0; i<arr.length; i++) {
			if(arr[i] > max) {
				max = arr[i];
				maxIndex = i;
			} else if(arr[i] == max) {
				maxIndex = -2;
			}
		}
		
		int res = maxIndex + 65;
		System.out.print((char)res);
	}
}

 

2908. 상수

문자열로 받아서 반전시켜주고, 정수형으로 더 큰 수 출력해주기.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String A = scan.next();
		String B = scan.next();
		scan.close();
		
		String newA="", newB="";
		for(int i=2; i>=0; i--) {
			newA = newA + A.charAt(i);
			newB = newB + B.charAt(i);
		}
		
		int max = Math.max(Integer.parseInt(newA), Integer.parseInt(newB));
		System.out.print(max);
	}
}

 

5622. 다이얼

numbers는 아스키코드 배열

time은 아스키코드 배열에 해당하는 초수를 담아논 배열

 

문자열 길이만큼 반복문을 돌리면서 index에 맞는 문자를 아스키코드로 변환한다.

그리고 numbers 배열과 비교해 아스키 코드가 위치하는 index를 발견하면 이 index로 time 배열에서 초수를 찾아 sum에 더하고 break 해주면 됨.

if else 사용하기 싫어서 다르게 풀어보았다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String dial = scan.next();
		scan.close();
		
		int[] numbers = {67, 70, 73, 76, 79, 83, 86, 90};
		int[] time= {3, 4, 5, 6, 7, 8, 9, 10};
		
		int sum = 0;
		for(int i=0; i<dial.length(); i++) {
			for(int j=0; j<numbers.length; j++) {
				int ascii = dial.charAt(i);
				if(numbers[j] >= ascii) {
					sum = sum + time[j];
					break;
				}
			}
		}
		System.out.println(sum);
	}
}

 

2941. 크로아티아 알파벳

배열을 크로아티아 알파벳으로 초기화 해두고, 반복문을 돌리면서 입력받은 문자열에 크로아티아 문자열이 있다면 한자리 문자로 replace해준다.

그리고 그 문자열의 길이를 출력! replace를 사용하면 쉽게 풀리는 문제

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		String array[] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

		Scanner scan = new Scanner(System.in);
		String str = scan.next();
		scan.close();
		
		for(int i=0; i<array.length; i++) {
			str = str.replace(array[i], "*");
		}
		
		System.out.println(str.length());
	}
}