문제 출처 : https://www.acmicpc.net/problem/14468
언어 : Kotlin
문제 설명 :
존의 농장에는 원형 목초지가 있고, 그 둘레에 길이 둘러져 있다. 존의 소는 매일 아침 이 길을 건너가 풀을 먹고 저녁에 다시 길을 건너가 헛간으로 돌아간다.
이 소들은 자신의 습관대로 매일 똑같은 방법으로 길을 건넌다. 각각의 소는 원형 길의 정해진 한 점을 지나 들어오고, 다른 점을 지나 나간다. 어떤 두 소도 길 위의 같은 점을 지나가지 않는다. 이걸 지켜본 존은 이 점들을 분석해 보기로 했다. 소는 총 26마리고, A, B, ... Z라는 이름이 붙는다. 존은 52개의 점을 시계방향으로 보면서 각 점을 어떤 소가 지나가는지 기록했다. 이렇게 만들어 낸 52글자의 문자열에는 각 알파벳이 두 번씩 나타날 것이다.
어떤 두 소는 어떤 방법으로 걷든 그 경로가 어딘가에서 만나야 될 수도 있다. 그런 소가 총 몇 쌍인지 구해 보자.
입력 :
첫 줄에 52글자의 문자열이 주어진다. 각 글자는 알파벳 대문자이며, 각 알파벳이 정확히 두 번씩 나타난다.
출력 :
경로가 무조건 만나는 소가 몇 쌍인지 출력한다.
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 512MB
입출력 예 :
입력 | 출력 |
ABCCABDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ | 1 |
풀이 :
검은색 화살표와 같이 겹치게 되는 경우를 찾으면 된다.
위 그림을 Index로 표현해보면 다음과 같을 것이다.
A.start[0] - B.start[1] - A.end[2] - B.end[2]
즉, A.start < B.start && B.start < A.end && A.end < B.end라는 것이다.
group[0]을 start, group[1]을 end로 정하고 문자열 순회를 시키며 위에서 세운 식을 대입하여 cnt를 증가시키면 된다.
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))
var cnt = 0
val group = Array(2) { Array(26) { 0 } }
readLine().forEachIndexed { index, c ->
val cur = c - 'A'
if (group[0][cur] == 0) group[0][cur] = index + 1 else group[1][cur] = index + 1
}
for (i in group[0].indices) {
for (j in group[1].indices) {
if (group[0][i] < group[0][j] && group[0][j] < group[1][i] && group[1][i] < group[1][j]) cnt++
}
}
bw.write("$cnt")
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
11365번: !밀비 급일 (0) | 2024.05.02 |
---|---|
10953번: A+B - 6 (0) | 2024.05.02 |
9250번: 문자열 집합 판별 (0) | 2024.05.01 |
1972번: 놀라운 문자열 (0) | 2024.05.01 |
23080번: 스키테일 암호 (0) | 2024.04.30 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!