문제 출처 : https://www.acmicpc.net/problem/17269
문제
시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다. 이름궁합을 보는 방법은 간단하다. 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 다음과 같이 알파벳을 적는데 필요한 획수가 주어진다. 예를 들어, 두 사람의 이름인 LEESIYUN, MIYAWAKISAKURA 를 같이 표현했을 때 다음과 같이 먼저 주어진 이름부터 한 글자씩 적는다.
두 사람의 이름을 알파벳 대문자로 표현한 뒤, 한 글자씩 번갈아가며 적는다.
예시 : L M E I E Y S A I W Y A U K N I S A K U R A
예시처럼 이름이 남을 경우엔 뒤에 남은 글자인 S A K U R A를 맨 뒤에 적는다. 그러고 나서 알파벳을 대응하는 숫자로 바꾸고 각 숫자와 그 숫자의 오른쪽 숫자와 더한 것을 밑에 적는다. 더한 숫자가 10이 넘을 경우엔 일의 자리 수만 남긴다. 이 과정을 반복하여 숫자가 2개만 남았을 때 남은 숫자가 두 사람의 궁합이 좋을 확률이 된다.
과정을 자세히 나타내면 다음과 같다.
초기 상태 : 1 3 4 1 4 2 1 3 1 1 2 3 1 3 2 1 1 3 3 1 2 3
한번 수행 : 4 7 5 5 6 3 4 4 2 3 5 4 4 5 3 2 4 6 4 3 5
두번 수행 : 1 2 0 1 9 7 8 6 5 8 9 8 9 8 5 6 0 0 7 8
세번 수행 : 3 2 1 0 6 5 4 1 3 7 7 7 7 3 1 6 0 7 5
...
19번 수행 : 5 7 0
20번 수행 : 2 7
따라서 LEESIYUN와 MIYAWAKISAKURA이 궁합이 좋을 확률이 27%이다.
입력
첫 번째 줄에 이름의 길이 N과 M을 받는다. (2 ≤ N, M ≤ 100)
다음 줄에 이름 A와 B를 입력받는다. 이름은 반드시 알파벳 대문자만 주어진다.
출력
A와 B의 이름궁합이 좋을 확률을 %로 출력한다. 단, 십의 자리가 0일 경우엔 일의 자리만 출력한다.
알고리즘 분류
풀이
간단한 구현 문제이다.
배열이나 map에 알파벳 획수를 미리 저장해놓고,
두 사람의 이름을 한 글자씩 번갈아가며 알파벳 획수로 배열에 저장한다.
이후, 배열의 arr[i] = (arr[i]+arr[i+1])%10을 계속해 가면서, 숫자가 두 개 남으면 종료한다.
코드
val charSet = mapOf<Char,Int>(
'A' to 3,
'B' to 2,
'C' to 1,
'D' to 2,
'E' to 4,
'F' to 3,
'G' to 1,
'H' to 3,
'I' to 1,
'J' to 1,
'K' to 3,
'L' to 1,
'M' to 3,
'N' to 2,
'O' to 1,
'P' to 2,
'Q' to 2,
'R' to 2,
'S' to 1,
'T' to 2,
'U' to 1,
'V' to 1,
'W' to 1,
'X' to 2,
'Y' to 2,
'Z' to 1
)
//2<=n,m<=100
fun main() = with(System.out.bufferedWriter()){
val br = System.`in`.bufferedReader()
val (n,m) = br.readLine().split(' ').map { it.toInt() }
val (str1,str2) = br.readLine().split(' ')
val sen = IntArray(str1.length+str2.length)
var (idx1,idx2) =Pair(0,0)
var senIdx=0
while(true){
if(idx1<str1.length)
sen[senIdx++] = charSet[str1[idx1++]]!!
if(idx2<str2.length)
sen[senIdx++] = charSet[str2[idx2++]]!!
if(idx1==str1.length && idx2==str2.length){
break
}
}
var senSize=sen.size-1
while(true) {
for (i in 0 until senSize) {
sen[i]= (sen[i]+sen[i+1])%10
}
sen[senSize--]=0
if(senSize==1){
write("${sen[0]*10 + sen[1]}%")
break
}
}
close()
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 2115 갤러리 Kotlin (구현) (0) | 2021.12.01 |
---|---|
백준 21758 꿀 따기 Kotlin (그리디, 누적 합) (0) | 2021.11.30 |
백준 13908 비밀번호 Kotlin (순열) (0) | 2021.11.28 |
백준 14391 종이 조각 Kotlin (완전탐색) (0) | 2021.11.28 |
백준 22251 빌런 호석 c++, Kotlin (완전탐색, 비트마스킹) (0) | 2021.11.28 |
댓글