백준 10809번 자바
https://www.acmicpc.net/problem/10809
10809번: 알파벳 찾기
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출
www.acmicpc.net
문제 내용은 아래 더보기를 누르면 나온다.
알고리즘
알파벳 소문자로만 이루어진 단어 S
S에 있는 알파벳들은 처음 등장한 위치값 저장
등장하지 않은 알파벳은 -1 저장
1. 알파벳 소문자의 길이 26만큼 배열을 만든다.
(이 때 배열은 int[] 을 써도되지만 Map<키,값> 도 만들면 괜찮을 듯 하다.)
2. 단어 S를 입력받는다.
3. 단어의 길이만큼 반복한다.
3-1. S.charAt(반복인덱스) 로 반복될 때마다 단어의 문자 하나씩을 가져온다.
3-2. 만약 문자에 해당하는 배열위치에 값이 -1 인가?
1) 맞다면 문자에 해당하는 배열위치에 값을 반복인덱스로 바꿔준다.
-> Map<키,값> 을 했다면 알파벳 소문자에 해당하는 키를 찾아서 값을 현재 반복인덱스값으로 바꿔주면 된다.
->. int[] 을 했다면 현재 charAt으로 가져왔기에 'a' 라면 인코딩값인 97을 가져오게 된다.
그렇다면 배열위치는 배열[0]으로 시작하기에 -'a' 또는 -97 을 해서 배열위치의 값을 반복인덱스값으로 바꿔준다.
2) 아니라면 넘어간다. (Continue)
4. 반복이 끝나면 배열을 출력한다.
풀이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));
StringBuilder sb = new StringBuilder();
// 알파벳에 해당하는 배열 만들기
int[] arr = new int[26];
// 배열을 -1로 초기화하기
for (int i = 0; i < 26; i++) {
arr[i] = -1;
}
// 단어를 입력받는다.
String S = br.readLine();
// 단어의 길이만큼 반복한다.
for (int i = 0; i < S.length(); i++) {
// 단어의 문자값에 해당하는 인코딩값을 -97 또는 -'a' 하여 알파벳 소문자 a가 0, z 가 25로 인덱스를 맞춰준다.
int index = S.charAt(i) - 'a';
// 만약 인덱스에 해당하는 배열위치가 -1인지 확인한다.
if (arr[index] == -1) {
// -1이 맞다면 처음 등장한 알파벳이므로 위치값을 저장한다.
arr[index] = i;
}
// -1이 아니라면 이미 등장한 알파벳이므로 넘어간다.
}
// 단어를 출력할 준비를 한다.
for (int i = 0; i < 26; i++) {
sb.append(arr[i]).append(" ");
}
// 단어를 출력한다.
System.out.println(sb);
}
}
알고리즘대로 풀었다. 혹시 헷갈릴까봐 무슨 행동을 하는지 주석으로 차근차근 적었다.
int[] 을 이용한 풀이법이다.
이렇게 쓰고보니 좀 더 편하게 쓸 수 있을것같다. 예를들면 for-each문이라든지 단어의 길이만큼 반복할때 인덱스를 구하는 방법?
기존 코드에서 바뀐 부분을 바꿔보았다.
index를 만들어서 사용했던 if문을 지금 보면 요약했지만 다른 사람이 보기에는 가독성이 좋지않아 보인다.
for-each문은 깔끔해보인다.
풀이2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashMap;
public class No_10809 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
HashMap<Integer, Integer> alphabetMap = new HashMap<>();
for (int i = 0; i < 26; i++) {
alphabetMap.put('a' + i, -1);
}
String S = br.readLine();
for (int i = 0; i < S.length(); i++) {
int index = S.charAt(i);
if (alphabetMap.get(index) == -1) {
alphabetMap.put(index, i);
}
}
alphabetMap.forEach((key, value) -> {
sb.append(value).append(" ");
});
System.out.println(sb);
}
}
HashMap을 써보았는데 int[]에 비해 성능이 안나올 것 같았는데 역시나 느렸다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 1157번 - Java(자바) (0) | 2022.02.17 |
---|---|
[백준] 2675번 - Java(자바) (0) | 2022.02.14 |
[백준] 11720번 - Java(자바) (0) | 2022.02.09 |
[백준] 11654번 - Java(자바) (0) | 2022.02.07 |
[백준] 1065번 - Java(자바) (0) | 2022.02.05 |