백준 5622번: 다이얼

2023. 9. 7. 21:08개인활동/코테

s = [*map(str, input())]
sec = 0
for i in s:
    if i == 'A' or i == 'B' or i == 'C':
        sec += 3
    elif i == 'D' or i == 'E' or i == 'F':
        sec += 4
    elif i == 'G' or i == 'H' or i == 'I':
        sec += 5
    elif i == 'J' or i == 'K' or i == 'L':
        sec += 6
    elif i == 'M' or i == 'N' or i == 'O':
        sec += 7
    elif i == 'P' or i == 'Q' or i == 'R' or i == 'S':
        sec += 8
    elif i == 'T' or i == 'U' or i == 'V':
        sec += 9
    elif i == 'W' or i == 'X' or i == 'Y' or i == 'Z':
        sec += 10
print(sec)

짧게 하고싶었는데...

도저히 머리가 안굴러간다.

 

궁금한 점이 생겼는데

if i == 'A' or i == 'B' or i == 'C':

에서 뒷 부분들은 i == 'A' or 'B' or 'C' 로 하면 제대로 연산이 안된다

왜그럴까?

 

숏코드는 좀 충격이다.

print(sum(min(5*ord(x)>>4,27)-17for x in input()))

일단 아스키코드를 사용하면 쉽게 풀 수 있는 문제인 것 같다.

 

위의 코드에서는 입력받은 값을 아스키코드로 변환하여 5를 곱하고 2로 세번 나눈 값을 반환하여 27과 비교했을 때 더 작은 값을 반환하고, 거기서 17을 빼주는 듯 하다. 그 값이 바로 다이얼을 돌리는 초가 되는 것 같다.

 

예를 들어서 확인해보자.

 

예를들어 입력된 값이 'W'라면 'W'의 아스키코드는 다음과 같다.

87*5 = 435, 435를 이진수로 바꾸고, 네번 오른쪽으로 비트를 이동시킨다

네번 오른쪽으로 비트를 이동시키면 000011011

이 값을 다시 10진수로 변환하면 27이 나온다

min(27, 27)의 결과는 27

27-17 = 10

따라서 'W'는 10초

1까지 돌리는데 2초부터 시작했으니 'W'가 10초가 나오는 것이 정답이다.

 

그렇다면 'D'를 한번 확인해보자. 'D'의 경우에는 4초가 나와야 한다는 점.

'D'의 아스키코드는 68

68 * 5 = 340, 340을 2진수로 바꾸면 다음과 같다

마찬가지로 오른쪽으로 비트를 이동시키면 000010101

다시 10진수로 변환하면 21이 나온다.

 

min(21, 27)의 결과는 21, 21 - 17은 4로 실제 정답과 같음을 확인할 수 있다.

 

이렇게 식을 세울 수 있다는 점이 굉장히 신기하다. 다양한 진수를 활용해 공식화하여 생각하는 것도 연습해야 할 것 같다.

'개인활동 > 코테' 카테고리의 다른 글

백준 2738번 : 행렬 덧셈  (0) 2024.01.02
백준 11718번: 그대로 출력하기  (0) 2023.09.13
백준 2908번: 상수  (0) 2023.09.06
백준 1152번: 단어의 개수  (0) 2023.09.06
백준 2657번: 문자열 반복  (0) 2023.09.05