Notice
Recent Posts
Recent Comments
Link
«   2026/07   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨

[ Java / 백준 10809] 문자열에서 특정 문자를 찾는 방법 (배열,indexOf, contains,IntStream) 본문

Back - end/JAVA

[ Java / 백준 10809] 문자열에서 특정 문자를 찾는 방법 (배열,indexOf, contains,IntStream)

낫쏘링 2023. 9. 5. 16:53
728x90

[ 1. 배열에 넣어서 찾기 ]

String str = "abcdefge";
int idx = -1;

// 문자열 쪼개서 배열에 넣기
String[] arr = str.split("");


[ 1. for문으로 찾기 ]

for(int i = 0; i < arr.length; i += 1){
	if(arr[i].equals("e")){
		idx = i;
                // 하나만 찾고 끝낼 경우
                System.out.println(idx);
                break;
                // 모두 찾을 경우
                // 1. if문 안에서 바로 인덱스 출력 : System.out.println(idx);
                // 2. 배열에 넣어서 출력
	}
}
// 마지막 요소만 찾을 경우
// for문 밖에서 마지막 인덱스만 출력 : System.out.println(idx);


[ 2. 향상된 for문으로 찾기 ]

for(String item : arr){
	idx += 1;
	if(item.equals("e")){
    		// 하나만 찾고 끝낼 경우
    		break;
        	// 모두 찾을 경우
        	// 1. if문 안에서 바로 인덱스 출력 : System.out.println(idx);
        	// 2. 배열에 넣어서 출력
    	}
}
System.out.print(idx);


[ 3. Arrays 클래스 사용하기 ]

// 오름차순 정렬 후 사용해야하기 때문에 기존 배열의 인덱스를 찾기에는 부적합하다.
import java.util.Arrays;

Arrays.sort(arr);
System.out.print(Arrays.binarySearch(arr,"e"));

 

[ 2. indexOf / contains로 찾기 ]

  • indexOf와 contains는 List와 String에서 사용 가능하다 일반 배열에는 사용 불가능
  • 단 List에서는 indexOf("찾을문자",검색 시작할 인덱스) 형태 사용 불가능
  • indexOf와 contains는 대소문자를 구분한다.
  • 외부 라이브러리인 StringUtils의 containsIgnoreCase를 사용하면 대소문자 무시가능
  • 찾는 문자가 없으면 -1 반
String str = "abcdefge";


[ 1. List로 변환해서 찾기 ]

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

// 문자열 쪼개서 배열에 넣기
String[] arr = str.split("");

List<String> strList = new ArrayList<String>();

// Arrays.asList(배열이름) : 배열을 List로 변환해준다.
strList.addAll(Arrays.asList(arr));
// List<String> strList = new ArrayList<String>(Arrays.asList(arr)); 도 가능
// List<String> strList = new ArrayList<String>(Arrays.asList(str.split(""))); 도 가능

// 📌📌 indexOf , lastIndexOf 사용해서 찾기
// 하지만 이 방법은 처음 찾은 문자의 인덱스를 반환하고 끝난다. (모두 찾기 불가능)
System.out.println(strList.indexOf("e")); // 4 출력 (앞에서 부터 찾기)
System.out.println(strList.lastIndexOf("e")); // 7 출력 (뒤에서 부터 찾기)

// 📌📌 contains 사용해서 찾기
// 하지만 이 방법은 true와 false를 반환하기 때문에 인덱스를 반환하려면 추가 로직 필요
System.out.println(strList.contains("e")); // true 출력
System.out.println(strList.contains("ㄴ")); // false 출력

// 📌📌 InStream 객체로 찾기
import java.util.stream.IntStream;

// 찾을 문자열 변수 선언
String target = "e";

// IntStream.range(시작인덱스, 반복할 횟수)
// filter : 조건에 맞는 요소 걸러내기
// 배열에서는 배열이름[i] , List에서는 리스트이름.get(i) 사용한다는 것 참고한다.
// filter(리스트의 인덱스 -> 조건문)
IntStream.range(0, strList.size())
	.filter(i -> target.equals(strList.get(i)))
	.forEach(System.out::println);


[ 2. String 상태에서 찾기 ]

// 📌📌 indexOf , lastIndexOf 사용해서 찾기
// 하지만 이 방법은 처음 찾은 문자의 인덱스를 반환하고 끝난다. (모두 찾기 불가능)
System.out.println(str.indexOf("e")); // 4 출력 (앞에서 부터 찾기)
System.out.println(str.indexOf("e",5)); // 7 출력 (앞에서 부터, 5번 인덱스부터 찾기)
System.out.println(str.lastIndexOf("e")); // 7 출력 (뒤에서 부터 찾기)
System.out.println(str.lastIndexOf("e",4)); // 4 출력 (뒤에서 부터,4번 인덱스까지 찾기)

// 📌📌 contains 사용해서 찾기
// 하지만 이 방법은 true와 false를 반환하기 때문에 인덱스를 반환하려면 추가 로직 필요
System.out.println(str.contains("e")); // true 출력
System.out.println(str.contains("ㄴ")); // false 출력

// 📌📌 InStream 객체로 찾기
import java.util.stream.IntStream;

// 찾을 문자 변수 선언 (문자열과 List에서 InStream 사용법의 차이점)
// String 문자열에서 찾을 때는 찾고자 하는 문자가 있으면 char 사용 (char는 큰따옴표 x)
// List에서 찾고자 하는 문자가 있으면 String 사용
char target = 'e';

// IntStream.range(시작인덱스, 반복할 횟수)
// filter : 조건에 맞는 요소 걸러내기
// filter(리스트의 인덱스 -> 조건문)
// charAt(i) 는 문자열을 문자로 쪼개 가져오는 것
IntStream.range(0, str.length())
        .filter(i -> str.charAt(i) == target)
        .forEach(System.out::println);
        
        
// charAt 사용할 때 주의할 점은 숫자를 찾고자 할 때 아스키 코드로 가져오기 때문에
// 찾고자 하는 숫자가 2일 경우 charAt(i) - '0'을 해줘야 한다.
// 아스키 코드에서 '0'는 문자이기 때문에 숫자로 변환하면 48
// '2' 또한 문자이기 때문에 숫자로 면환하며 50 즉 '2'에서 '0'을 빼면 50 - 48 = 2가 나온다.

// 찾을 숫자 변수 선언
int target = 2;

IntStream.range(0, str.length())
    .filter(i -> str.charAt(i)-'0' == target)
    .forEach(System.out::println);

 

 

[ 백준 10809번 ]

[ for문과 향상된 for문 활용 ]
속도 : 132ms
String str = br.readLine();
int[] aArr = new int[26];
Arrays.fill(aArr, -1);

for(int a = 0; a < 26; a += 1) {
    for(int i = 0; i < str.length(); i += 1) {
        if((char)(a + 97) ==  str.charAt(i) && aArr[a] == -1) {
            aArr[a] = i;
        }
    }
}

for(int a : aArr) {
    bw.write(String.valueOf(a) + " ");
}​
[ indexOf 활용 ]
속도 : 128ms
String str = br.readLine();
        
// 아스키 코드 '0' == 45 , 'A' == 65, 'a' == 97 (소문자 - 대문자 = 32)
// 문제의 포인트는 '처음' 찾은 문자의 '인덱스'를 출력하고, 없으면 -1을 출력한다는 점이다.
// 만약 주어진 문자열이 apple인 경우 p의 자리에는 1이 들어간다.
// indexOf는 문자열에서 특정 문자를 찾을 때 앞에서부터 찾고, '처음' 찾은 문자의 인덱스만 반환하며, 없으면 -1을 반환한다.
// contains는 인덱스가 아닌 true / false 반환

// 문자 하나에 ''를 감싸주면 자동으로 아스키코드르 통해 숫자로 변환
for(int i = 'a'; i <= 'z'; i += 1) {
    bw.write(String.valueOf(str.indexOf(i)) +" ");
}​
728x90