본문 바로가기
알고리즘 문제 풀이/백준

백준 17269 이름궁합 테스트 Kotlin (구현)

by 옹구스투스 2021. 11. 29.
반응형

문제 출처 : https://www.acmicpc.net/problem/17269

 

17269번: 이름궁합 테스트

시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다. 이름궁합을 보는 방법은 간단하다. 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 다음과 같이 알파벳을 적는데

www.acmicpc.net

문제

시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다. 이름궁합을 보는 방법은 간단하다. 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 다음과 같이 알파벳을 적는데 필요한 획수가 주어진다. 예를 들어, 두 사람의 이름인 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()
}
반응형

댓글