본문 바로가기
Algorithm(알고리즘)/Java

Java 백준 단계별 풀기 (기초 문법 정리) 문자열

by Jun_N 2020. 12. 26.

11654 - 아스키 코드

방법 1 ) charAt(0)

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
 
		Scanner in = new Scanner(System.in);
 
		int ch = in.next().charAt(0);
        
		System.out.print(ch);
	}
}

방법 2) System.in + throws Exception

public class Main {
	public static void main(String[] args) throws Exception { 
		int a = System.in.read();
		System.out.print(a);
	}
}

이게 byte 값으로 문자 한 개만 읽기 때문에 속도가 훨씬 빠르다.

 

11720 - 숫자의 합

방법 1) 기본적인 방법 charAt

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {		
		Scanner in = new Scanner(System.in);
 
		int N = in.nextInt();
		String a = in.next();
		in.close();
		
		int sum = 0;
        
		for(int i = 0; i < N; i++) {
			sum += a.charAt(i)-'0';
		}
		System.out.print(sum);
	}
}

방법 2) getBytes()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
	public static void main(String[] args) throws IOException {		
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		br.readLine();	// N 은 쓸모가 없으므로 입력만 받는다.
		
		int sum = 0;
		
		for(byte value : br.readLine().getBytes()) {
			sum += (value - '0');	// 또는 (a-48)
		}
		System.out.print(sum);
	}
}

문자열을 byte로 반환해준다. 문자 하나씩 가져올 수 있다.  

 

10809 - 알파벳 찾기

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
		int[] arr = new int[26];
		
		for(int i = 0; i < arr.length; i++) {
			arr[i] = -1;
		}
 
		String S = br.readLine();
 
		for(int i = 0; i < S.length(); i++) {
			char ch = S.charAt(i);
    
			if(arr[ch - 'a'] == -1) {	// arr 원소 값이 -1 인 경우에만 초기화
				arr[ch - 'a'] = i;
			}
		}
 
		for(int val : arr) {	// 배열 출력
			System.out.print(val + " ");
		}
	}
}

Scanner로 할 경우 nextLine() 사용. ( 속도가 더 느림)

 

2675 - 문자열 반복

방법 1 )

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

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());

        for (int i = 0; i < T; i++) {

            String[] str = br.readLine().split(" "); // 공백 분리

            int R = Integer.parseInt(str[0]); // String -> int
            String S = str[1];

            for (int j = 0; j < S.length(); j++) {
                for (int k = 0; k < R; k++) {
                    System.out.print(S.charAt(j));
                }
            }
            System.out.println();
        }
    }

}

방법 2) StringBuilder 사용.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
    
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
        
		int T = Integer.parseInt(br.readLine());        
 
		for (int i = 0; i < T; i++) {
 
			String[] str = br.readLine().split(" ");
 
			int R = Integer.parseInt(str[0]);
 
			for (byte val : str[1].getBytes()) {
				for (int j = 0; j < R; j++) {
					sb.append((char)val);
				}
			}
			sb.append('\n');
		}
		System.out.print(sb);
	}
 
}

 

1157 - 단어 공부

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

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        int[] arr = new int[26];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 0;
        }
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch - 'a' < 0) {
                arr[ch - 'a' + 32] += 1;
            } else {
                arr[ch - 'a'] += 1;
            }
        }
        int max = -1;
        char ch = '?';

        for (int i = 0; i < 26; i++) {
            if (arr[i] > max) {
                max = arr[i];
                ch = (char) (i + 65); // 대문자로 출력해야하므로 65를 더해준다.
            } else if (arr[i] == max) {
                ch = '?';
            }
        }
        System.out.println(ch);
    }

}

 

1152 - 단어의 개수

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

public class Main {

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

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        System.out.println(st.countTokens());
    }
}

StringTokenizer를 사용하면 공백을 기준으로 token의 개수만 꺼내올 수 있다.

countTokens()를 활용하면 쉽게 풀 수 있음.

 

2908 - 상수

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

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int A = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
        int B = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());

        System.out.print(A > B ? A : B);

    }
}

StringBuilder의 reverse()를 사용하면 문자열을 뒤집을 수 있다.

 

5622 - 다이얼 

방법 1) HashMap 사용

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

public class Main {
    public static void main(String[] args) throws IOException {
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();// 초기값 지정
        map.put('A', 2);
        map.put('B', 2);
        map.put('C', 2);
        map.put('D', 3);
        map.put('E', 3);
        map.put('F', 3);
        map.put('G', 4);
        map.put('H', 4);
        map.put('I', 4);
        map.put('J', 5);
        map.put('K', 5);
        map.put('L', 5);
        map.put('M', 6);
        map.put('N', 6);
        map.put('O', 6);
        map.put('P', 7);
        map.put('Q', 7);
        map.put('R', 7);
        map.put('S', 7);
        map.put('T', 8);
        map.put('U', 8);
        map.put('V', 8);
        map.put('W', 9);
        map.put('X', 9);
        map.put('Y', 9);
        map.put('Z', 9);

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        int count = 0;
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            count += map.get(ch) + 1;
        }
        System.out.println(count);

    }
}

 

2941 - 크로아티아 알파벳

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

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        for (int i = 0; i < croatia.length; i++) {
            if (s.contains(croatia[i])) {
                s = s.replaceAll(croatia[i], "*");
            }
        }

        System.out.println(s.length());

    }
}

 

문자열에서 contains를 하면 포함 여부를 알 수 있고 replaceAll을 하면 해당 문자열을 원자는 문자열로 교체할 수 있다.

1316 - 그룹 단어 체커

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        int Nocount = 0;
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            sb.delete(0, sb.length()); // StringBuilder 초기화
            for (int j = 0; j < s.length(); j++) {
                if (sb.toString().contains(String.valueOf(s.charAt(j)))) {
                    Nocount++;
                    break;
                }
                if (j != s.length() - 1 && s.charAt(j) != s.charAt(j + 1)) {
                    sb.append(s.charAt(j));
                }
            }
        }
        System.out.println(N - Nocount);
    }
}

StringBuilder 초기화는 sb.delete(0,sb.length())로 하면 된다.

알고리즘은 다음에 연속되지 않은 단어가 나오면 sb에 그 단어를 추가하고 만약에 지금 검사하려는 단어가 sb에 있는 단어이면 그룹 단어가 아니라는 count를 증가시키고 break 한다.

(sb에 있는 단어라는 뜻은 이미 한번 나왔다는 뜻)