반응형

1. 문제 번호 1316번


 

 

 

2. 문제 풀이 (한줄 평가)

 - 핵심은 n 과 n-1을 비교하여야 연속됌을 판단할 수 있음  

 

 

나의 문제풀이 방식 및 순서

 

 * 나의 다양한 학습이 우선이기 때문에 다양한 방법을 생각 *

 

문제를 먼저 정확히 파악 

new          -> 모두 단어가 1번 사용됌

vvba         -> 모두 단어가 1번 사용됌 (v 연속적인 단어는 인정)

aba           -> a가 연속적이지 않고 2번 사용됌 (X)

bbab         -> b가 연속적이였지만 끝에 사용되어 2번 사용됌(X)

abbbbba   -> (X)

 

  1. 첫 번째 방법 
    1. 각 영 단어 26개 배열에 True,False를 넣어둔다.
    2. 단어(abbbba)의 첫 번째 index는 해당 단어는 사용되었으니 True
    3. 단어(abbbba)의 두 번째 index와 첫 번째 index를 비교하여 값이 동일하면 pass / 다르면 해당 단어에 True
    4. 단어(abbbba)의 여섯 번째 index와 다섯 번째 index를 비교하여 값이 다르니 해당 단어에 True
      1. 근데 이미 a는 True가 있으니 이것은 그룹 단어가 아니다. !!! 
  2. 두 번째 방법
    1. 단어(abbbba)의 중복을 제거한 문자를 추출
    2. 중복 제거한 문자의 index를 전체 뽑는다.
    3. index값이 인접한 값인지 recursive하여 확인

 

 

여전히 어렵다...정답비율이 이렇게 높아...?

손으로 움직이기 전 규칙이나 반례, 설계부터 긴 시간을 들여서 고민하고 손 코딩하고 움직여야겠다..😊

 

 

 


3. 소스 인증

 

import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int inputCnt = Integer.parseInt(br.readLine());
        int groupWordCnt = 0;

        for(int i = 0; i < inputCnt; i++){
            String inputLine = br.readLine();
            boolean [] alphabet = new boolean[26];
//            Arrays.fill(alphabet,false);
            boolean isGroupWord = true;
            
            for(int j = 0; j < inputLine.length(); j++){
                char currentChar = inputLine.charAt(j);
                
                if (j > 0 && alphabet[currentChar-'a'] && currentChar != inputLine.charAt(j-1)){
                    isGroupWord = false;
                    break;    
                }
                alphabet[currentChar-'a'] = true;
            }
            if(isGroupWord){
                groupWordCnt++;    
            }
        }
        System.out.println(groupWordCnt);

    }
}

 

 

 

import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int inputCnt = Integer.parseInt(br.readLine());
        int groupWordCnt = 0;

        for (int i = 0; i < inputCnt; i++){
            String inputLine = br.readLine();
            String dis_inputLine = "";
            
            Map<Character,List<Integer>> indexesMap = new HashMap<>();

            /* 방법 1. 중복제거 */
            for(int j = 0; j < inputLine.length(); j++){
                if(inputLine.indexOf(inputLine.charAt(j)) == j ){
                    dis_inputLine += inputLine.charAt(j);
                }
            }
            /* 방법 2. 중복제거 */
            // Set<Character> set = new HashSet<>();
            // for (int j = 0; j < inputLine.length(); j++){
            //     char c = inputLine.charAt(j);

            //     if (!set.contains(c)){
            //         dis_inputLine += c;
            //     }
            // }

            /* 방법 1. 포함여부 확인 */
            inputLine.contains(dis_inputLine);
            /* 방법 1. 일치여부 확인 */
            inputLine.equals(dis_inputLine);
            
            /*방법 3. 중복 제거 후 HashMap Insert */
            // for(int j = 0; j < inputLine.length(); j++){
            //     if(inputLine.indexOf(inputLine.charAt(j)) == j ){
            //         indexesMap.put(inputLine.charAt(j),new ArrayList<>());
            //     }
            // }
            
            /* 중복을 제거한 key를 삽입 */
            for (int j = 0; j < dis_inputLine.length(); j++){
                indexesMap.put(dis_inputLine.charAt(j), new ArrayList<>());
            }
            /* 
            a : 1,2,3 b : 4,5,6 
            중복을 제거한 Key와 기존의 데이터를 비교하여 
            포함되는 index 삽입 
            */
            for (int j = 0; j < inputLine.length(); j++){
                char currentChar = inputLine.charAt(j);
                if(indexesMap.containsKey(currentChar)){
                    indexesMap.get(currentChar).add(j);
                }
            }
            
            
            // Set<String> keySet = indexesMap.keySet();
            // char[] keyAry = keySet.toCharArray(new Character[0]);
            
            //또는 for(char c : keyAry) 가능
            for(char c : dis_inputLine.toCharArray()){ 
                List<Integer> indexes = indexesMap.get(c);
                if(isConsecutive(indexes)){
                    groupWordCnt +=1;
                } else {
                    groupWordCnt = 0;
                }
            }
            System.out.println(groupWordCnt);

        }

    }
    public static boolean isConsecutive(List<Integer> indexes){
        for (int i = 1; i < indexes.size(); i++){
            if(indexes.get(i) != indexes.get(i-1) +1 ){
                return false;
            }
        }
        return true;
    }
}

 

 

- 실패 소스코드 -




4. 추가 개념

 

 

 

 

 

 


5. 참조 블로그


 

불편함을 느끼실 경우 연락 주시면 곧 바로 삭제하도록 하겠습니다.

 


 

 

 

 

 

 

 

728x90
반응형

+ Recent posts