백준 1864번: 문어 숫자

최창효·2022년 1월 8일
0
post-thumbnail


문제 설명

  • 문자열을 규칙에 맞는 숫자로 변환하는 문제입니다.

접근법

  • A는a에 대응한다가 여러 개 등장하면 dict형태로 정리할 수 있습니다.
  • 8진법에 기반한다. 예를 들면 다음과 같다의 설명은 다음의 규칙을 보여주고 있습니다.
    • 이러한 방식은 for문으로 지수의 값을 1씩 줄여가면서 구현할 수 있습니다.

정답

dct = {	# 딕셔너리 자료형에 대응값을 넣습니다
       '-':0,
       '\\':1,
       '(':2,
       '@':3,
       '?':4,
       '>':5,
       '&':6,
       '%':7,
       '/':-1
       }

while True: #입력을 무한히 반복합니다
    a = input() #입력값 변수를 받습니다
    if a == '#': #'#'문자를 만나면
        break	#입력이 종료됩니다
    n = len(a)-1	#8진법의 지수는 왼쪽에서 오른쪽으로 가는 경우 (문자의 길이-1)->0까지 지속됩니다
    sum_ = 0 #8진법의 모든 자리수 값을 더한 값이 담기게 됩니다
    for i in a:	#반복문을 실행합니다
        sum_+=dct[i]*(8**n) #i번째 자리수를 8진법으로 변환합니다. +=으로 표시해 기존의 값에 계속해서 더해져 담깁니다
        n-=1 #n = n-1과 동일한 표현입니다. 지수를 1씩 빼줍니다

    print(sum_)

기타

  • 파이썬에서 문자열 속\특별한 기능을 가진 특수문자를 일반적인 문자로 변환시켜 주는 역할을 담당합니다.
    • \는 동일한 의미입니다.
    • 문자열 표시의미를 가지는 '를 의미가 없는 문자열 '로 표현하기 위해서는 \'로 표현해야 합니다.
      • a = 'it's show time' -> 에러
      • a = 'it\'s show time' -> 정상 작동
    • 아무런 의미 없는 \를 표현하기 위해서는 \\로 작성해야 합니다.
      • \\\특수한 의미를 지닌 문자에서 특수한 의미를 지닌 문자 = \가 되었다고 생각하시면 됩니다.
  • 입력의 끝이 주어지지 않았다면? (여기서는 '#'으로 끝나는 부분을 명시했습니다)
    • 참조문서
    • 입력이 끝났을 때
      • input()은 EOFError를 발생시킵니다.
      • sys.stdin.readline()은 빈 문자열을 반환합니다.
    • 해결방법
# input()으로 입력을 받을 경우
while True:
    try:
        a = input()
    except EOFError:
        break
# sys.stdin.readline()으로 입력을 받을 경우    
import sys    
while True:
    a = sys.stdin.readline()
    if not a:
        break
  • a+=ba = a+b와 동일합니다.
    • 이러한 표현은 기존의 값(a)에 새로운 값(b)를 계속 더할 때 사용합니다.
  • velog는 \$수식\$을 통해 수식을 표현할 수 있습니다.
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글