반응형
1. 문제 번호 1316번
2. 문제 풀이 (한줄 평가)
- 핵심은 n 과 n-1을 비교하여야 연속됌을 판단할 수 있음
나의 문제풀이 방식 및 순서
* 나의 다양한 학습이 우선이기 때문에 다양한 방법을 생각 *
문제를 먼저 정확히 파악
new -> 모두 단어가 1번 사용됌
vvba -> 모두 단어가 1번 사용됌 (v 연속적인 단어는 인정)
aba -> a가 연속적이지 않고 2번 사용됌 (X)
bbab -> b가 연속적이였지만 끝에 사용되어 2번 사용됌(X)
abbbbba -> (X)
- 첫 번째 방법
- 각 영 단어 26개 배열에 True,False를 넣어둔다.
- 단어(abbbba)의 첫 번째 index는 해당 단어는 사용되었으니 True
- 단어(abbbba)의 두 번째 index와 첫 번째 index를 비교하여 값이 동일하면 pass / 다르면 해당 단어에 True
- 단어(abbbba)의 여섯 번째 index와 다섯 번째 index를 비교하여 값이 다르니 해당 단어에 True
- 근데 이미 a는 True가 있으니 이것은 그룹 단어가 아니다. !!!
- 두 번째 방법
- 단어(abbbba)의 중복을 제거한 문자를 추출
- 중복 제거한 문자의 index를 전체 뽑는다.
- 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
반응형
'알고리즘(BOJ) 문제풀이' 카테고리의 다른 글
[BOJ/백준] 2차원 배열_ 2738번 (0) | 2024.05.19 |
---|---|
[BOJ/백준] 1차원 심화_ 25206번 (0) | 2024.05.19 |
[BOJ/백준] 심화_2941번 (0) | 2024.05.18 |
[BOJ/백준] 심화_1157번_hashMap_JavaStream정리 미완성 (0) | 2024.05.17 |
[BOJ/백준] 심화_10988번 (0) | 2024.05.17 |