개발자는 기록이 답이다

[백준/BOJ][Java][10809] 알파벳 찾기 본문

알고리즘/백준

[백준/BOJ][Java][10809] 알파벳 찾기

slow-walker 2023. 8. 24. 14:40

2023.08.21 - [Java] - Java, String의 constant pool과 Heap의 차이

 

Java, String의 constant pool과 Heap의 차이

Java String 문자열? 순서를 가진 문자들의 집합 “쌍따옴표를 통해 나타낼 수 있음” 글자, 단어, 문장, 문서 등 문자로 구성된 자료형 // 기본 자료형 int var_integer = 10; double var_real - 3.141592; char var_ch

strong-park.tistory.com


 

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

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

 

문제 : 입력받은 문자열의 각 인덱스 값을 알파벳에 해당하는 위치에 넣어준다.

 

내가 푼 풀이

 

알파벳 수만큼 배열을 만들어서 전부 -1로 세팅한 뒤,  a + i 와 일치하는 아스키코드 알파벳일 경우, 해당 문자열의 인덱스값을 대입해준다.

// 'a' + int => int
System.out.println('a' + i ); // --> 97
// str.charAt(j) => char
System.out.println("str.charAt(j) = " + str.charAt(j)); // --> a
// int랑 char의 값 비교
'a' + i == str.charAt(j) // --> true
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));
        String str = br.readLine();

        int[] count = new int[26];
        for (int i = 0; i < 26; i++) {
            count[i] = -1;
            for (int j = 0; j < str.length(); j++) {
                if ('a' + i == str.charAt(j)) {
                    int targetIdx = str.indexOf(str.charAt(j));
                    count[i] = targetIdx;
                }
            }
        }
        StringBuilder ans = new StringBuilder();
        for (int target : count) {
            ans.append(String.valueOf(target) + " ");
        }
        System.out.println(ans);
    }
}

 

메모리 시간 언어 코드 길이
11528KB 76ms Java8 836B

 

다른 사람 풀이 1

- 입력 문자열을 toCharArray()함수를 통해 캐릭터 배열로 바꾼 뒤 for문을 도는 방식이다.

- 이미 -1로 세팅하고 나서 조건에 맞을 경우 입력 문자열의 인덱스 대입한다.

- 캐릭터 배열의 인덱스 값에서 -97('a')한 값을 loc변수에 저장한뒤, 알바펫 배열의 인덱스로 사용한다.

   // 입력받은 문자열의 첫번째 인덱스 알파벳이 뭔지 확인
   System.out.println("arr[i] = " + arr[i]); // -> b
    
    // b - 97 = 1
    // num 알파벳 배열에서 b의 위치는 1
    System.out.println(arr[i] - 97); // -> 1
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main  {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		char arr[] = br.readLine().toCharArray();
		int num[] = new int[26];
		for (int i = 0; i < 26; i++) {
			num[i] = -1;
		}

		for (int i = 0; i < arr.length; i++) {
			int loc = arr[i] - 97;
		

			if (num[loc] == -1) {
				num[loc] = i;
				//System.out.println(arr[i] + " = "+loc);

			}
		}
		for (int i = 0; i <  26; i++) {
			System.out.print(num[i] + " ");
		}
	}

}
메모리 시간 언어 코드 길이
12892KB 68ms Java8 686B

 

다른 사람 풀이 2

 

새로운 알파벳 배열에 담은걸 For문으로 문자열을 출력하는게 아니라, character[]로 담은 입력 문자열이 알파벳 a부터 z까지 일치하는 경우 print로 줄바꿈없이 바로 출력되게 하는 방식이다. 첫 번째 조건문은 이해가 되는데, 두 번째 조건문은 잘 이해가 안간다..

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

public class Main {

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

        char[] S;

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

        S = br.readLine().toCharArray();

        for (int i = 'a'; i <= 'z'; i++) {

            for (int j = 0; j < S.length; j++) {

                if (S[j] == i) {
                    System.out.print(j + " ");
                    break;
                }
                if (j == S.length - 1) {

                    System.out.print(-1 + " ");
                }

            }

        }

    }

}
메모리 시간 언어 코드 길이
12912KB 68ms Java8 621B

 

 

응용풀이

 

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));
        char[] charArray = br.readLine().toCharArray();

        int[] count = new int[26];
        for (int i = 0; i < 26; i++) {
            count[i] = -1;
            for (int j = 0; j < charArray.length; j++) {
                if ('a' + i == charArray[j]) {
                // 분기처리를 안하면 처음 등장하는 위치가 아닌 마지막 위치가 저장된다
                    if (count[i] != -1)
                        break;
                    else
                    count[i] = j;
                }
            }
        }

        for (int target : count) {
            System.out.print(String.valueOf(target) + " ");
        }
    }
}
메모리 시간 언어 코드 길이
11552KB 76ms Java8 815B