문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
문제 링크
풀이
이 문제에서 원하는 것은 '문자열에서 같은 문자들끼리 뭉쳐있는가?' 이다.
한 문자라도 떨어져 있다면, 이 문자열은 더 이상 그룹 단어가 아니게 된다.
우리는 떨어져 있는 문자가 있는 지 없는 지만 체크하면 된다.
1. 먼저 문자열을 맨 앞에서 부터 차례대로 확인한다.▼
다음 문자로 넘어갔을 때 이전 문자와 같다면 그룹 단어의 조건에 충족하므로 넘어간다.
2. 하지만 다음 문자로 넘어갔을 때 이전 문자와 다르다면, 그룹 단어인지 체크해야한다.▼
3. 그룹 단어가 아닐 조건은 문자가 연속해서 있지 않은 경우이다.
그러면 문자 연속의 마지막 부분이 나왔는데, 문자열 뒷부분에 문자가 더 있을 때 이다.
우리는 다른 부분을 기준으로 그 뒤에 앞의 문자가 있는 지 체크해주면 된다.
그래서 다른 부분을 기준으로 문자열을 잘라서 새로 만든 후, 검사해준다.
위의 경우 a가 뒤에 한 번 더 나오므로 그룹 단어가 아니다.▼
4. 그룹 단어가 아닌 이상 종료해주고, 그룹 단어가 아닌 정보를 발견하지 못했다면 위 과정을 다시 반복해준다.
5. 끝까지 반복했는데 그룹 단어가 아닌 정보를 찾지 못했다면, 이 단어는 그룹 단어다.
6. 그룹 단어 개수를 세서 출력해준다.
Swift 코드
let N = Int(readLine()!)!
var groupWord = 0
for _ in 0..<N {
let word = readLine()!
var error = 0
var arr = [Character]()
for i in word {
arr.append(i)
}
for i in 0..<(arr.count - 1) {
if arr[i] != arr[i + 1] {
var newArr = [Character]()
for j in (i + 1)..<word.count {
newArr.append(arr[j])
}
if newArr.contains(arr[i]) {
error += 1
}
}
}
if error == 0 {
groupWord += 1
}
}
print(groupWord)
이 코드는 꽤 예전에 짠 코드인데, 그룹 단어가 아닐 때 바로 종료하면 더 빠르게 끝났을 거 같다.
그런데 그래봤자 최대로 탐색할 문자 개수는 기껏해야 문자 100개 짜리 단어 100개이므로, 이 문제에서는 거기서 거기다.
하지만 제한 조건이 더 넓어진다면, 그룹 단어가 아닌 순간 종료시켜줘야할 거 같다.
'Algorithm > BOJ PS' 카테고리의 다른 글
백준 1493번 박스 채우기 - SWIFT (0) | 2024.02.27 |
---|---|
백준 1477번 휴게소 세우기 - SWIFT (0) | 2024.02.27 |
백준 1300번 K번째 수 - SWIFT (0) | 2024.02.26 |
백준 1181번 단어 정렬 - SWIFT (0) | 2024.02.25 |
백준 1167번 트리의 지름 - SWIFT (0) | 2024.02.20 |