CodingTest/Baekjoon

[baekjoon] 백준 2608번(파이썬): 로마 숫자

JunJangE 2022. 1. 22. 13:16

문제

 

2608번: 로마 숫자

첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작거나 같고, 두 수의 합은 4000보다 작다.

www.acmicpc.net

알고리즘

- 아라비아 숫자는 반복문을 통해 각 자릿수를 탐색한다.

- 탐색하면서 자릿수가 2개 합쳤을 때 단어가 되는지 확인하고 단어가 되면 그 단어에 값을 더해준다.

- 단어가 되지 않으면 하나의 단어의 값을 더해주었다.

- 이때 탐색유무를 꼭 체크해주면서 문제를 수행해야 한다.

- 로마 숫자를 구하는 것은 밑에 두 코드가 다르지만 결국 자릿수에 따라서 문자를 더해주는 것은 같다.

코드

import sys


# 아라비아 숫자 구하기
def Arabia(word):
    answer = 0
    visited = [False] * len(word)

    # 반복문을 통해 탐색하지 않은 자리수를 확인
    for i in range(len(word)):
        if not visited[i]:
            # 자리수 2개를 합쳤을 때 단어가 two_nums에 있다면
            if len(word) > i + 1 and word[i: i + 2] in two_nums:
                visited[i: i + 2] = True, True # 탐색 여부
                answer += two_nums[word[i: i + 2]]

            # 그 외 단어는 nums에 포함되어 있는 것
            else:
                visited[i] = True  # 탐색 여부
                answer += nums[word[i]]

    return answer


# 로마 숫자 구하기
def roma(m):
    answer = ""

    # 반복문을 통해 자리수를 확인하면서 로마 숫자로 바꿔준다.
    for i in range(len(m), 0, -1):
        n = int(m[-i]) # 각 자리수의 수

        # 4번째 자리수
        if i == 4:
            answer += "M" * n

        # 3번째 자리수
        elif i == 3:
            if n == 9:
                answer += 'CM'
            elif n == 4:
                answer += 'CD'
            else:
                if n >= 5:
                    answer += 'D'
                answer += 'C' * (n % 5)

        # 2번째 자리수
        elif i == 2:
            if n == 9:
                answer += 'XC'
            elif n == 4:
                answer += 'XL'
            else:
                if n >= 5:
                    answer += 'L'
                answer += 'X' * (n % 5)

        # 1번째 자리수
        elif i == 1:
            if n == 9:
                answer += 'IX'
            elif n == 4:
                answer += 'IV'
            else:
                if n >= 5:
                    answer += 'V'
                answer += 'I' * (n % 5)
    return answer


nums = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
two_nums = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}

firstWord = str(sys.stdin.readline().rstrip("\n"))
secondWord = str(sys.stdin.readline().rstrip("\n"))
total = Arabia(firstWord) + Arabia(secondWord)
print(total)
print(roma(str(total)))

 

다른 정답 코드

import sys


def Arabia(word):
    answer = 0
    visited = [False] * len(word)

    for i in range(len(word)):
        if not visited[i]:

            if len(word) > i + 1 and word[i: i + 2] in two_nums:
                visited[i: i + 2] = True, True
                answer += two_nums[word[i: i + 2]]
            else:
                answer += nums[word[i]]
                visited[i] = True

    return answer



def roma(n):
    s=""
    while n>0:
        if n>=1000:
            s+="M"
            n-=1000
        elif n>=900:
            s+="CM"
            n-=900
        elif n>=500:
            s+="D"
            n-=500
        elif n>=400:
            s+="CD"
            n-=400
        elif n>=100:
            s+="C"
            n-=100
        elif n>=90:
            s+="XC"
            n-=90
        elif n>=50:
            s+="L"
            n-=50
        elif n>=40:
            s+="XL"
            n-=40
        elif n>=10:
            s+="X"
            n-=10
        elif n>=9:
            s+="IX"
            n-=9
        elif n>=5:
            s+="V"
            n-=5
        elif n>=4:
            s+="IV"
            n-=4
        elif n>=1:
            s+="I"
            n-=1
    return s

nums = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
two_nums = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}

firstWord = str(sys.stdin.readline().rstrip("\n"))
secondWord = str(sys.stdin.readline().rstrip("\n"))
total = Arabia(firstWord) + Arabia(secondWord)
print(total)
print(roma(total))

위 코드는 처음으로 푼 코드인데 너무 무식하게 문제를 푼 거 같아서 다시 풀어보았었지만 위 코드가 맨 위에 코드보다 더 빨랐다..

github

 

GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법

내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.

github.com