개발놀이터

1-6. 중복된 문자 제거 본문

기타/코딩테스트

1-6. 중복된 문자 제거

마늘냄새폴폴 2023. 2. 7. 16:02

package string.duplicateword16.my;

import java.util.Scanner;

public class Main {

    /**
     * 맞췄다아아아아아아아아아아아아아아아아
     *
     * savePoint 의 개념 도입으로 save 배열에 알파벳이 담기는 첫 순간은 지나가고
     * 그 후에는 savePoint 의 수가 1이 아니게 되기 때문에 이점을 이용하여 중복 제거
     *
     * 진짜 자괴감 엄청나다...
     * 선생님이 너무 쉽게 풀어버려서 똥꼬쑈 한 내가 너무 바보된 느낌...
     *
     * String 클래스의 indexOf 를 이용하면 정말정말 쉽게 풀린다...
     *
     * cf) indexOf 란?
     * 쉽게 말해 index 위치를 알려주는 것이다.
     *
     * ex) String str = Spring 이라는 글자에서
     * str.indexOf(S) = 0
     * str.indexOf(n) = 4
     * str.indexOf(t) = 1
     *
     * 이런식으로 몇번째에 위치하고 있는지를 알려주는 것
     *
     * 이걸 문제에 적용시키면 다음과 같다.
     *
     * 문제 : ksekkset
     * for (int i = 0 ; i < str.length() ; i++) {
     *     System.out.println(str.charAt(i) + ", " + i + ", " + str.indexOf(str.charAt(i)));
     * }
     *
     * 결괏값
     * k 0 0
     * s 1 1
     * e 2 2
     * k 3 0
     * k 4 0
     * s 5 1
     * e 6 2
     * t 7 7
     *
     * 즉 i 값과 indexOf 해서 나온 값이 같으면 answer 에 저장 아니면 무시하면 되는 것이었다..
     * for (int i = 0 ; i < str.length() ; i++) {
     *      System.out.println(str.charAt(i) + ", " + i + ", " + str.indexOf(str.charAt(i)));
     *      if (i == str.indexOf(str.charAt(i))) {
     *          answer += str.charAt(i);
     *      }
     * }
     *
     * 진짜 너무 허무하다...
    */

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String input = kb.next();

        System.out.println(solution(input));
    }

    private static String solution(String input) {
        String answer = "";
        char[] c = input.toCharArray();
        char[] save = new char[100];
        int cnt = 0;

        for (int i = 0; i < c.length; i++) {
            int savePoint = 0;
            save[cnt] = c[i]; // ksekkset -> kset
            // save[0] = k / savePoint = 1
            // save[1] = s / savePoint = 1
            // save[2] = e / savePoint = 1
            // save[3] = k / savePoint = 2
            // save[4] = k / savePoint = 3
            // save[5] = s / savePoint = 2
            for (int j = 0; j < save.length; j++) {
                if (save[j] == c[i]) {
                    savePoint++;
                    if (savePoint != 1) {
                        c[i] = '\0';
                    }
                }
            }
            cnt++;
        }

        for (int i = 0; i < c.length; i++) {
            if (c[i] != '\0') {
                answer += c[i];
            }
        }

        return answer;
    }
}

 

나름 참신한 발상으로 문제를 풀고 정답을 맞췄지만 선생님의 풀이에 힘이 쭉 빠지는 문제였다...

 

나는 30분 40분 고민해가면서 죽자고 풀어내면 선생님은 특정 클래스의 특정 메서드를 사용하여 너무 간단하게 풀어버린다. 

 

자세한 내용은 주석 참고

 

package string.duplicateword16.teacher;

import java.util.Scanner;

public class Main {

    private static String solution(String str) {
        String answer = "";

        for (int i = 0; i < str.length(); i++) {
            //System.out.println(str.charAt(i) + " " + i + " " + str.indexOf(str.charAt(i)));
            if (i == str.indexOf(str.charAt(i))) {
                answer += str.charAt(i);
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        System.out.println(solution(str));
    }
}

'기타 > 코딩테스트' 카테고리의 다른 글

1-8. 유효한 회문 문자열  (0) 2023.02.09
1-7. 회문 문자열  (0) 2023.02.09
1-5. 특정 문자 뒤집기  (0) 2023.02.07
1-4. 단어 바꾸기  (0) 2023.02.07
1-3. 문장 속 단어찾기  (0) 2023.02.07