문제 출처 : https://www.acmicpc.net/problem/27962
언어 : Kotlin
문제 설명 :
오렌지를 먹은 지 오래된 선생님은 부족한 비타민C를 문자열 문제를 통해 보충하려고 한다. "오렌지 먹은 지 오랜지"의 "오렌지", "오랜지"와 같이, 길이가 동일하며 각각 맨 앞, 맨 뒤 문자를 포함하는 어떤 두 부분 문자열이 앞에서부터 하나씩 비교했을 때 정확히 한 문자만 다른 경우, 전체 문자열을 "비타민 문자열"이라 부르려고 한다. 주어진 문자열이 "비타민 문자열"이면 YES, 아니면 NO를 출력하라.
두 문자열 s와 t가 있을 때 t가 s에서 연속해서 나타난다면 t를 s의 부분 문자열이라 한다. 예를 들어, abcdedc의 부분 문자열로는 ab, bcde, dedc, abcdedc 등이 있다.
두 부분 문자열은 겹쳐도 무방하며, 부분 문자열의 길이는 1 이상이어야 한다. aabaacaa는 맨 앞 문자를 포함하는 부분 문자열 aabaa와 맨 뒤 문자를 포함하는 동일한 길이의 부분 문자열 aacaa를 앞에서부터 하나씩 비교했을 때 정확히 한 문자가 다르기 때문에, 비타민 문자열에 해당한다.
입력 :
첫 번째 줄에 문자열의 길이 N이 주어진다. (2 ≤ N ≤ 2,000)
두 번째 줄에 문자열이 주어진다. 문자열은 알파벳 소문자로만 이루어져 있다.
출력 :
입력으로 주어진 문자열이 "비타민 문자열"이면 YES를, 아니면 NO를 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 1024MB
입출력 예 :
입력 | 출력 |
15 orangeateorenge |
YES |
2 cc |
NO |
14 aaaaaabaaaaaaa |
YES |
풀이 :
앞, 뒤에서 1 .. n 길이의 문자열을 한자리씩 비교하며 다른 문자가 1개만 있을 경우 YES.
문자열이 "1234"로 주어졌을 경우,
"1", "4" - 1개
"12", "34" - 2개
"123", "234" - 3개
"1234", "1234" - 0개
이므로 문자가 1개만 다른 "1", "4"가 존재하기에 문자열 "1234"는 비타민 문자열이다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val n = readLine().toInt()
val s = readLine()
bw.write(if (isVitaminString(n, s)) "YES" else "NO")
bw.flush()
bw.close()
}
fun isVitaminString(n: Int, s: String): Boolean {
for (i in 1 until n) {
val sub1 = s.substring(0, i)
val sub2 = s.substring(n - i, n)
var diffCount = 0
for (j in 0 until i) {
if (sub1[j] != sub2[j]) diffCount++
if (diffCount > 1) break
}
if (diffCount == 1) return true
}
return false
}
'백준 > 문제' 카테고리의 다른 글
27497번: 알파벳 블록 (0) | 2024.07.31 |
---|---|
25178번: 두라무리 휴지 (0) | 2024.07.31 |
18245번: 이상한 나라의 암호 (0) | 2024.07.30 |
12174번: #include <Google I/O.h> (0) | 2024.07.26 |
26560번: Periods (0) | 2024.07.26 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!