1. 문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
2. 전체 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String S = sc.nextLine();
byte[] byte_S = S.getBytes();
for(int j=97;j<=122;j++) {
int cnt=0;
for(int i=0;i<byte_S.length;i++) {
if(j==byte_S[i]) {
if(cnt==0) System.out.print(i+" ");
cnt++;
}
}
if(cnt==0) System.out.print("-1 ");
}
sc.close();
}
}
3. 풀이
byte[] byte_S = S.getBytes();
입력받은 문자열 S를 byte배열로 바꿔주는 이유는 해당 문자의 ASCII코드 값을 불러오기 위함이다.
문자열의 각 문자들의 ASCII코드 값을 byte_S 배열에 저장한다.
for(int j=97;j<=122;j++) {
int cnt=0;
for(int i=0;i<byte_S.length;i++) {
if(j==byte_S[i]) {
if(cnt==0) System.out.print(i+" ");
cnt++;
}
}
if(cnt==0) System.out.print("-1 ");
}
97부터 122는 a부터 z까지의 ASCII 코드값이다.
<안쪽 반복문>
문자열의 길이는 모르므로, byte_S.length (byte_S배열의 길이)만큼 반복문을 돌린다. 아스키 코드값과 byte_S[i]값이 일치하면, cnt를 1씩 증가하도록 한다.
cnt를 1씩 증가시키기 전에 cnt==0이면 출력하게끔 하면, 문자열의 첫번째로 나오는 경우에만 출력된다.
예를 들면 hello 의 경우, l은 두번 나오지만, 첫번째 l을 만나면 먼저 해당 값을 출력하고, cnt를 1증가 시켜 다음 l을 만났을 경우에는 출력이 되지 않도록 한다.
<바깥 반복문>
cnt의 값이 0인 경우, -1을 출력하도록 한다. (문자열에 포함되지 않는 문자들)
4. 링크
'Computer Science > 자료구조와 알고리즘' 카테고리의 다른 글
[JAVA] 백준 2675번 : 문자열 반복 (0) | 2021.07.10 |
---|---|
[Algorithm] Exhaustive Search(완전검색), Greedy Algorithm(탐욕 알고리즘), Sort(정렬) (0) | 2021.07.07 |
[알고리즘] 역순 정렬 및 값 교환 (0) | 2021.02.11 |
[알고리즘] 드모르간 법칙(De Morgan's law)이란? (0) | 2021.02.11 |
[알고리즘] 최댓값 구하기 - java (0) | 2021.02.11 |