백준 1316 그룹단어체커 (구현의 발상의 전환, 예외처리를 복잡하더라도 할것인가? vs 발상의 전환을 할 것인가)
https://www.acmicpc.net/problem/1316
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
//6:15
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = N;
for(int i=0 ; i<N; i++){
String str = br.readLine();
char prev = 0;
boolean[] alphabet= new boolean[26];
for(int j=0; j<str.length(); j++){
char now = str.charAt(j);
if(prev != now){
if(!alphabet[now-'a']){
alphabet[now-'a']=true;
prev = now;
}
else{
count--;
break;
}
}
}
}
System.out.println(count);
}
}
내 힘으로 풀어보다가 너무 예외처리가 많아서 일단 그만두었다.
나는
i와 i+1이 같은지 비교하고,
같다면 i++;
다르다면 alphaber[i-'a'] = true 로 바꿔주고 i++; 을 할려고 했다.
이 문제는
happy와
aa 의 차이처럼
문자열 맨 끝에 왔을때 발생한다.
i가 문자열 맨 끝에 위치해있을때
i+1에 접근하면 에러가 발생하므로 총 2가지에 관해서 추가로 예외처리 생각하고 있었다
1) happy처럼 맨 뒤에 하나가 남을때
2) aa처럼 i랑 i+1이 같아서 끝까지 왔을때
이렇게 되면
while(true)
while(i<length-1 &&arr[i] == arr[i+1]) {
}
//마지막에 왔을때
if(i==length-1){
if(alphabet[arr[i]-'a']==0){
가능함
}
else{
불가능함
}
}
--------------------------------------------------------------------------------------------------------------------------
다음날 이 글을 마저 쓰고있는데 왜 저렇게 오답을 했는지 음...
전체에서 안되는걸 빼겠다!
이거는 확통 여집합 풀때처럼 하나의 유형이니 이런것도 했었지 느낌으로 보면 될거같고
이 기준을 어떻게 잡을것이냐인데
1) 만약 정방향으로 되는걸 하나씩 count했다면
문자열 마지막 index까지 와서 count를 올려줘야한다. + 안되면 그때 break 시키고 빠져나가면 된다.
2) 만약 전체에서 안되는걸 빼는 형식의 여집합으로 설계한다면
안되면 그떄 break 시키고 빠져나가기만 하면 된다.
이렇게만 봐도 하나의 고려사항( 문자열 마지막 index까지 와서 count를 올려줘야한다)이 줄어들기에 당연히 2)을 선택할 것이다.