반응형
접근 방법)
꽤나 코드를 짜는 것이 어려운 문제였다. 처음에 알파벳 a~z까지 크기 26의 boolean형 배열을 생성하고 해당 알파벳이 등장하면 해당 알파벳에 해당하는 배열 값을 1로 바꾸게 설정한다.그러면 알파벳에 해당하는 배열 값이 1일 경우 한 번 등장한 적이 있다는 의미가 된다.
그리고 동일한 알파벳이 연속적으로 나올 경우는 어떻게 처리할 것인지 문제였다.이것은 생각보다 단순하였다. 이전 알파벳과 현재 알파벳을 비교하여 같을 경우 아무런 코드를 실행하지 않고, 다를 경우 현재 알파벳에 해당하는 배열 값에 따라 return값을 다르게 주어 문제를 풀어 나갈 수 있다.
아직 이해하기 어렵지만 코드를 보면서 다시 살펴보자
정답 코드 1)
import java.util.Scanner;
class Main{
static Scanner sc = new Scanner(System.in);
public static void main(String[] args){
int n = sc.nextInt(); // 총 실행횟수(첫 번째줄 입력값)
int count = 0; // 출력할 결과 값
for(int i = 0; i < n; i++){
if(confirm() == true){
count++;
}
}
System.out.println(count);
}
public static boolean confirm(){
int[] alphabet = new int[26]; // 알파벳 int형 배열 생성, 기본 값은 모두 0
String s = sc.next();
int before = 0; // 전 알파벳, 후 알파벳을 비교할 때 사용할 전 알파벳 정수 값.
for(int i = 0; i < s.length(); i++){
int num = s.charAt(i); // 입력받은 알파벳을 하나하나 아스키코드로 비교할 것임.
if(num != before){ // 전 알파벳과 후 알파벳이 다를 경우
if(alphabet[num-'a']==0){ // 현재 알파벳에 해당하는 배열 값이 0일 경우 (= 한 번도 등장한 적 없음)
alphabet[num-'a'] = 1; // 배열 값을 1로 설정하여 등장한 적이 있음으로 설정
before = num; // 전 알파벳 값에 후 알파벳 값을 할당
}else if(alphabet[num-'a']==1){ // 현재 알파벳에 해당하는 배열 값이 1일 경우 (= 한 번 등장한 적 있음)
return false; // 이미 등장한 적이 있는 알파벳이 또 나온 경우이기에 그룹 단어가 아님. false 값 리턴
}
} // 같을 경우는 아무런 코드를 실행하지 않음.
}
return true; // for문에서 아무런 문제 없이 false를 리턴 받은 적이 없는 그룹 단어임을 의미
}
}
전 알파벳과 후 알파벳을 하나하나 비교하고, 후 알파벳에 해당하는 배열 값이 0일 경우와 1일 경우 2가지를 또 구분하여 코드를 작성했다.
만약 알파벳에 해당하는 배열 값이 1일 경우는 한 번 알파벳이 등장한 경우이기에 return값을 false로 하여 그룹단어가 아님을 나타낸다. 이 for문에서 return 값이 false에 도달한 적이 없다면 return 값을 true로 하여 그룹단어임을 나타낸다.
이 문제를 풀 때 동일한 알파벳이 연속적으로 나올 경우 어떻게 처리할 지 가장 고민을 많이 했던 것 같다.
반응형
'Baekjoon 자바 코드 > 심화1' 카테고리의 다른 글
[백준] 25083번 새싹 코드 (Java 자바) (0) | 2024.10.07 |
---|---|
[백준] 25206번 너의 평점은 풀이 코드 (Java 자바) (0) | 2024.05.17 |
[백준] 2941번 크로아티아 알파벳 풀이 코드 (Java 자바) (0) | 2024.05.02 |
[백준] 1157번 단어 공부 풀이 코드 (Java 자바) (0) | 2024.04.30 |
[백준] 10988번 팰린드롬인지 확인하기 풀이 코드 (Java 자바) (0) | 2024.04.24 |