코드 저장소

공부에는 끝이 없다!

JAVA/코딩 테스트

백준 문제 풀이 - 문자열 단계

VarcharC2K 2023. 8. 14. 21:24

어느덧 문자열 단계까지 넘어왔다.

문자열 문제는 꽤 풀어봤던 터라 어렵지는 않았고 반복문을 사용하던 것을 함수로 썼던 것이라던지 좀더 쉽게 푸는 방법들을 정리해보려 한다.

 

9068번 문자열 (브론즈 5)

 

문자열을 입력으로 주면 문자열의 첫 글자와 마지막 글자를 출력하는 프로그램을 작성하는 문제이다.

 

SubString을 사용하거나 배열을 써서 처음과 끝을 배열에 담고 출력하는 분들도 계셨다.

나는 StringBuilder를 사용해서 입력받은 문자열의 처음과 끝을 charAt 메서드로 뽑아내서 append 시키고 출력하는 방법을 사용했다.

 

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

class Main{
    public static int n;
    public static String s;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < n; i++){
            s = br.readLine();
            sb.append(s.charAt(0)).append(s.charAt(s.length()-1));
            System.out.println(sb.toString());
            sb = new StringBuilder();
        }
        br.close();
    }
}

이렇게 짜니 메모리도 조금 덜먹고 속도도 조금 더 빠르게 처리 가능한 것을 확인 할 수 있었다.

 

문자열 문제중에는 아스키 코드값을 출력하거나 아스키 코드값을 문자로 변환하여 출력하는 문제도 있었다.

결국 두 문제 모두 핵심은 아스키 코드를 어떻게 변환할 것인가였는데, 아스키 코드를 출력하고 싶으면 Character를 Int로 변환하고, 반대로 하고 싶을때에는 int를 Character 값으로 변환하면 된다.

 

10809번 알파벳 찾기(브론즈 2)

해당 문제는 알파벳이 등장하는 위치를 찾는 문제로 알파벳 값을 어떻게 검증할 것인가가 중점인 문제이다.

재밌게 푸신 분들이 많았는데, char 변수로 a-z까지 반복문을 돌면서 인덱스를 찾는 다던지

import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String s = scanner.next();
		
		for(char c='a'; c<='z';c++) {
			System.out.print(s.indexOf(c)+" ");
		}
	}
}

이중 포문으로 알파벳의 위치를 찾아 출력을 한다던지 (보통은 이 경우가 가장 많았다)

import java.io.*;

public class Main {

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

		String s = br.readLine(); // 문자열 입력받기
		String alphabet = "abcdefghijklmnopqrstuvwxyz"; // 알파벳 문자열 생성
		int[] result = new int[alphabet.length()]; // 위치를 저장할 배열
		boolean[] changed = new boolean[alphabet.length()];
		
		for(int i = 0; i < alphabet.length(); i++) { // 각 알파벳을 반복하면서 
			if(s.contains(Character.toString(alphabet.charAt(i)))) { // 알파벳이 단어에 있는 경우
				// 문자열에서 해당 알파벳의 위치를 결과 배열에 저장
				for(int j = 0; j < s.length(); j++) {
					if(alphabet.charAt(i) == s.charAt(j) && changed[i] == false) {
						result[i] = j;
						changed[i] = true;
					}
				}
			}
			else result[i] = -1; // 알파벳이 단어에 없는 경우
		}
		
		for(int i = 0; i < result.length; i++) {
			if(i == result.length - 1) System.out.print(result[i]);
			else System.out.print(result[i] + " ");
		}
	}
}

나는 'a'에 해당하는 int 값으로 포문을 돌려 출력하는 방식을 사용하였다.

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

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

        for(int i =97; i < 123; i++){
            System.out.print(s.indexOf((char)i) + " ");
        }
    }
}

첫번째 방식과 char 형태로 할건지 int 형태로 할건지만 다르다고 생각하면 되겠다.

인덱스는 어차피 indexOf 메서드가 가장 첫 인덱스를 반환하기에 간단하게 짜기 위하여 다음과 같이 풀었다.

확실히 코드 수도 줄고 메모리나 시간 면에서도 좀더 빠른 것을 확인 할 수 있었다.