문제
알고리즘
- 아라비아 숫자는 반복문을 통해 각 자릿수를 탐색한다.
- 탐색하면서 자릿수가 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
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 1074번(파이썬): Z (0) | 2022.01.24 |
---|---|
[baekjoon] 백준 2870번(파이썬): 수학숙제 (0) | 2022.01.23 |
[baekjoon] 백준 9536번(파이썬): 여우는 어떻게 울지? (0) | 2022.01.21 |
[baekjoon] 백준 3048번(파이썬): 개미 (0) | 2022.01.20 |
[baekjoon] 백준 2002번(파이썬): 추월 (0) | 2022.01.19 |