코테 기초

240405 한 번만 등장하는 문자

서버관리자 페페 2024. 4. 5. 10:18
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public String solution(String s) {
        
        /*
        보기 -> 설계 :
        - 한 번만 등장한 문자
        - 사전순
        - 특이 처리->빈 문자열
        
        메소드 공급 및 투어 결정 : 
        - ArrayList를 만들어 !contains로 판단해서 넣는다 
        - Collection.sort한다
        - 첫 투어는 charAt으로
        
        상세 입출력 current 확인 : string 입력 / string 출력
        
        *특이처리 굳이 안해도 되는구나
        
        
        */
        
        // 떠오르는 흐름 : char를 arraylist에 넣
        // 작성 : ISC + Field + T/O + OEC
        
        // Field : slot + 
        ArrayList<Character> list = new ArrayList<>();
        
        
        // Touring Operation
        for (char T : s.toCharArray()) {
            if (!list.contains(T)) list.add(T);   
        }
        Collections.sort(list);
        
        // OEC : list ->toArray? 가 아닌 string 변환이다
        // builder로 -append하자
        StringBuilder sb = new StringBuilder();
        for (char T : list) {
            sb.append(T);
        }
        
        return sb.toString();
    }
}

 

처음 버리기 : 잊어버림

 

시도1

계속 훈련한 결과 다행히 메소드는 제대로 공급
오류 발생 단계 : 문제를 잘못 이해하고 있었다

내가 한 것 : 있는 모든 문자를 중복없이 하나씩만 넣어서 사전 정렬
필요한것 : 하나만 있는것

 

어떻게 해야 하는가? -> 사전은 맞으니 그대로 놔두고, 넣는것을 다시 설계

 

 

시도 2 : 

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public String solution(String s) {
        
        ArrayList<Character> list1 = new ArrayList<>();
        ArrayList<Character> list2 = new ArrayList<>();
        ArrayList<Character> list4 = new ArrayList<>();
        
        // A : 원래 스트링을 list1로 만든다
        for (char T : s.toCharArray()) {
            list1.add(T);
        }
        
        // B : 빈 list 2 : list1에서 하나씩 집어넣는다(!contains). 
        for (char T : list1) {
            if (!list2.contains(T)) list2.add(T);   
        }
        
        // C : list1에서 list2를 빼서도 살아남는 것들은 두개 이상씩 든 문자들이다
        // 리스트 복제
        ArrayList<Character> list3 = new ArrayList<>(list1);
        for (char T : list2) {
            list3.remove(T);
        }
        
        // D : list1을 순회하면서 3 아닌 문자를 넣는다
        Collections.sort(list3);
        StringBuilder sb = new StringBuilder();
        for (char T : list1) {
            if (!list3.contains(T)) sb.append(T);
                
        }
        
        return sb.toString();

    }
}

오류가 난 뒤 아무리 봐도 모르겠다면 한 줄씩 테스트하는 수밖에 없다

복사 메서드를 처음 사용했으니 오류가 날 여지가 많을 것이다. 우선 거기서부터 시작해본다

 

-

 

복사가 아직 익숙치 않음 -> 원 리스트, 카피본 영향받는 얇은 등이 될 수 있으므로

메소드는 나중에 찾아보고 우선 수동으로 리스트를 만든다

 

 

list 3에도 인자 넣어주기 전에 생성해줘야 되는점 주의

 

-

 

시도 3 :

다시 시도해도 E지만, 정확히 어떤 숫자로 E가 발생하는지 유추함

첫번째 string 길이는 9이다

이걸 보면서 한줄씩 따라가볼것

-> 프로그래머스 페이지에서는 줄별로 블럭별로 디버깅이 어려우므로 우선 아래 블럭들을 지우고 시도 -> 오류 있는지 파악

B까지 진행했을때 E가 발생하지 않는다

 

C까지 진행시에 E 발생 확인, 내가 remove를 잘못 사용하고 있었구나

 

이제 어떻게 하지?

 

remove메서드 자체는 문제가 없을 것이다, Integer character offset문제인가?

우선 B까지의 결과를 출력해보자

 

 

B단계까지는 의도한대로 작동했다

 

'코테 기초' 카테고리의 다른 글

코딩 기초 트레이닝 : 2차원 순회하면서 1++ 채우기  (0) 2024.04.09
offset, 매칭  (0) 2024.04.05
컨트롤 제트  (0) 2024.04.04
A로 B 만들기  (0) 2024.04.04
잘라서 배열로 저장하기  (0) 2024.04.04