어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨
[ Java / 백준 10809] 문자열에서 특정 문자를 찾는 방법 (배열,indexOf, contains,IntStream) 본문
Back - end/JAVA
[ Java / 백준 10809] 문자열에서 특정 문자를 찾는 방법 (배열,indexOf, contains,IntStream)
낫쏘링 2023. 9. 5. 16:53728x90
[ 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
'Back - end > JAVA' 카테고리의 다른 글
| [ Java / 백준 9086, 11720] charAt의 사용에 대해서 (0) | 2023.09.05 |
|---|---|
| [ Java / 백준 27866 ] 문자열에서 숫자로 문자 찾기 (0) | 2023.09.05 |
| [ Java ] Arrays 클래스 (0) | 2023.09.03 |
| [ Java / 백준15552 ] BufferedReader & BufferedWriter (1) | 2023.08.31 |
| 23.05.11 / MVC 패턴 - 회원가입 , 서블릿(Servlet) (0) | 2023.05.11 |