[JAVA-알고리즘 문제풀이] 중복 문자 제거

반응형
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를 리턴한다.

 

 

반응형

Designed by JB FACTORY