문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서,
단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다.
단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.
예제 입력 | 예제 출력 |
baekjoon | 1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 |
⭕ 풀이
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
br.close();
String[] alphaArr = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
StringBuilder sb = new StringBuilder();
for(int i=0;i<alphaArr.length;i++){
sb.append(input.indexOf(alphaArr[i])).append(" ");
}
System.out.print(sb);
}
}
✅ 소문자알파벳배열을 만든뒤
입력받은 문자열에서 indexOf 로 a~z가 있는지 모두 체크한다.
indexOf 메서드는 찾는다면 찾은위치를, 찾지못한다면 -1 을 반환하는 메서드이기때문에
-1 로 초기화 시켜주지 않고 작성했다.
✅ 다른분의 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String S = in.readLine();
StringBuilder sb = new StringBuilder();
for (int i = 'a'; i <= 'z'; i++) {
int idx = 0;
int flag = 0;
for (int j = 0; j < S.length(); j++) {
if((int)S.charAt(j) == i) {
flag = 1;
idx = j;
break;
}
}
if(flag == 1){
sb.append(idx).append(" ");}
else{
sb.append(-1).append(" ");}
}
System.out.println(sb);
}
}
1. 우선 바깥의 for문은 i를 'a'로 초기화하고 'z'까지 반복하며
문자열에서 각 문자의 위치를 담을 idx와
해당 문자가 있는지의 여부를 판단할 flag 변수를 0 으로 초기화 시켜준다.
2. 안쪽 for문에서 j = 0 이고 입력문자열의 길이까지 반복하며
charAt( j )
입력문자열이 baekjoon 이라면 문자 b를 (int) 로 형변환 시켜 i랑 비교한다
❗ System.out.println('a'==97); 의 결과는 true이므로 if문의 조건식은 저렇게 사용해도 무방하다.
3. 바깥for문 1. 첫반복 i 가 'a'이며97일때
안쪽for문 1. 'b'이자98인 입력문자열의 j번째(첫문자)를 발견하지 못했으므로 넘어간다.
안쪽for문 2. 'a'이자97인 입력문자열의 j번째(두번째문자)와 같으므로
if문으로가서 flag는 1로 초기화시키고 idx는 j가 현재 1이므로 1로 초기화하고
찾았으니 break로 탈출한다
4. flag == 1 즉 찾았다는 의미이므로 sb에 j로 초기화시켰던 idx를 append한다.
만약 안쪽for문에서 해당 문자를 찾지못했다면 flag는 계속 0 일것이므롤
바깥의 if문에서 else로 처리되어 -1을 append하게된다.
나의 코드는 뭔가 풀면서도 이게 맞나.. 알파벳을 잘못 적게되거나 그런 실수를 하면 어쩌지..라는 느낌이 계속 들었는데
다른분의 코드를 보니 저렇게하면 확실히 실수할 확률이 더 적지않을까 싶었다.
최대한 원천데이터를 직접 적지않고 저렇게 비교할 수 있는 쪽으로 생각해봐야겠다.
-출처
'Algorithm > Baekjoon(Java)' 카테고리의 다른 글
[백준/JAVA] 1157 : 단어 공부 ( System.in.read(); ) (0) | 2022.07.24 |
---|---|
[백준/JAVA] 2675 : 문자열 반복 (0) | 2022.07.24 |
[백준/JAVA] 11720 : 숫자의 합 ( char - '0', 48 ) (0) | 2022.07.23 |
[백준/JAVA] 11654 : 아스키 코드 (0) | 2022.07.22 |
[백준/JAVA] 1065 : 한수 (0) | 2022.07.21 |