[JAVA-알고리즘 문제풀이] 중복 문자 제거
- Algorithm/Problem Solving
- 2022. 11. 21.
반응형
728x90
반응형
문제
문자열에서 문자 중복을 제거하여 문자 순서대로 출력한다.
나의 풀이
package com.algorithm._01_그리디_구현;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @Date 2022/11/21
*/
public class LC5_중복문자제거 {
static String str;
public static void main(String[] args) {
// write your code here
LC5_중복문자제거 main = new LC5_중복문자제거();
System.out.println(main.solution());
}
public String solution() {
input();
List<Character> result = new ArrayList<>();
IntStream.range(0, str.length())
.filter(i -> !result.contains(str.charAt(i)))
.forEach(i -> result.add(str.charAt(i)));
return result.stream()
.map(Object::toString)
.collect(Collectors.joining(""));
}
private void input() {
Scanner sc = new Scanner(System.in);
str = sc.next();
}
}
1) List 객체에 데이터를 중복 없이 담는다.
IntStream.range(0, str.length())
.filter(i -> !result.contains(str.charAt(i)))
.forEach(i -> result.add(str.charAt(i)));
2) List -> String 으로 변환한다.
return result.stream()
.map(Object::toString)
.collect(Collectors.joining(""));
해설 풀이
package com.algorithm._01_그리디_구현;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @Date 2022/11/21
*/
public class LC5_중복문자제거 {
static String str;
public static void main(String[] args) {
// write your code here
LC5_중복문자제거 main = new LC5_중복문자제거();
System.out.println(main.lecture_solution());
}
/*
ksekkset
k 0 0
s 1 1 // 이렇게 같으면 첫번째로 등장한 문자
e 2 2
k 3 0 // 자기 자신은 index 3인데, 0 이라는건 중복문자라는 것이다.
k 4 0
s 5 1
e 6 2
t 7 7
*/
public String lecture_solution() {
input();
StringBuilder answer = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
/* indexOf(..) : str.charAt(i) 이 문자의 첫번째 index */
System.out.println(str.charAt(i) + " " + i + " " + str.indexOf(str.charAt(i)));
if (str.indexOf(str.charAt(i)) == i) { // 같으면 첫번째로 발견된 문자다.
answer.append(str.charAt(i));
}
}
return answer.toString();
}
private void input() {
Scanner sc = new Scanner(System.in);
str = sc.next();
}
}
1) 포인트 캐치
System.out.println(str.charAt(i) + " " + i + " " + str.indexOf(str.charAt(i)));
ksekkset 을 입력했을때 아래와 같이 출력된다.
ksekkset
k 0 0
s 1 1
e 2 2
k 3 0
k 4 0
s 5 1
e 6 2
t 7 7
indexOf() 메서드
첫번째로 발견된 index를 리턴한다.
k 0 0
0, 0이 동일하다면 첫번째로 등장한 문자라는 것이다.
k 3 0
3, 0이라면 해당 문자는 0번째 index에 이미 등장한 문자가 존재한다는 뜻으로, 중복된 문자라는 의미다.
indexOf()
public static int indexOf(byte[] value, int ch, int fromIndex) {
if (!canEncode(ch)) {
return -1;
}
int max = value.length;
if (fromIndex < 0) {
fromIndex = 0;
} else if (fromIndex >= max) {
// Note: fromIndex might be near -1>>>1.
return -1;
}
byte c = (byte)ch;
for (int i = fromIndex; i < max; i++) {
if (value[i] == c) {
return i;
}
}
return -1;
}
for문에서 문자열을 찾으면 바로 return 하므로, 특정 문자를 찾을 경우 첫번째로 발견된 index를 리턴한다.
반응형
'Algorithm > Problem Solving' 카테고리의 다른 글
[JAVA-알고리즘 문제풀이] 문자열 압축 (0) | 2023.03.05 |
---|---|
[JAVA-알고리즘 문제풀이] 가장 짧은 문자 거리 (0) | 2023.03.01 |
[JAVA-알고리즘 문제풀이] 대소문자 변환 (0) | 2022.09.06 |
[Baekjoon 7568번] 덩치 문제 (with 자바) (0) | 2022.07.31 |
[Baekjoon 18406번] 럭키 스트레이트 문제 (with 자바) (0) | 2022.07.05 |