노베이스 알고리즘 공부 #11. 백준 5622 다이얼 - Python

Anny·2024년 4월 7일
0

https://www.acmicpc.net/problem/5622

1. 문제

-- 다이얼 전화기 작동 원리와 동일
-- 숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
-- 할머니가 외운 단어가 주어졌을 때, 최소 시간 구하기

2. 풀이

2-1. 접근

  1. 알파벳 별로 숫자 부여: 딕셔너리 사용
  2. 딕셔너리에 대응하는 숫자를 찾음
  3. 대응하는 숫자 + 1 = 소요되는 시간

이런식으로 풀면 되지 않을까,,

2-2. 딕셔너리 생성

eng_num = {'A': 2, 'B': 2, 'C': 2, 'D': 3, 'E': 3, 'F': 3, 'G': 4, 'H': 4, 'I': 4, 'J': 5, 'K': 5, 'L': 5, 'M': 6, 'N': 6, 'O': 6, 'P': 7, 'Q': 7, 'R': 7, 'S': 7, 'T': 8, 'U': 8, 'V': 8, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9}

사실 이거 만들면서 느꼈다. 이렇게 풀면 안될거 같은디,,

2-3. 1트

N = len(input())
word = map(char, input().split())
total_time = 0

for _ in range(N):
	count = eng_num[word]
    total_time += count + 1

print(total_time)

이번 문제 어렵다(?)
호기롭게 에러 여러개 생성하고 틀렸는데, 그 이유는
1-1. intput.split은 문자열을 공백 기준으로 분할하는데, 입력에 공백이 없다.
1-2. map함수에서 int로 받듯이 char로도 받을 수 있지 않을까 싶었는데, char 함수는 존재하지 않는다함.
2. N과 word 변수에서 input을 두 번 받는다.

2-4. 2트

eng_num = {'A': 2, 'B': 2, 'C': 2, 'D': 3, 'E': 3, 'F': 3, 'G': 4, 'H': 4, 'I': 4, 'J': 5, 'K': 5, 'L': 5, 'M': 6, 'N': 6, 'O': 6, 'P': 7, 'Q': 7, 'R': 7, 'S': 7, 'T': 8, 'U': 8, 'V': 8, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9}

word = input()
N = len(word)  
total_time = 0

for _ in range(N):
    count = eng_num[word]
    total_time += count + 1 

print(total_time)

면 또 오류가 난다. 왜!!

word가 문자열 전체를 나타내기 때문임 ㅇㅇ.
하 이번 문제 어렵다22
word[0] -> 문자열 첫 번째 문자 나타냄
word[_] -> _번째 문자를 나타내기 때문에 이게 올바른 표현이라고함

2-5. 정답

eng_num = {'A': 2, 'B': 2, 'C': 2, 'D': 3, 'E': 3, 'F': 3, 'G': 4, 'H': 4, 'I': 4, 'J': 5, 'K': 5, 'L': 5, 'M': 6, 'N': 6, 'O': 6, 'P': 7, 'Q': 7, 'R': 7, 'S': 7, 'T': 8, 'U': 8, 'V': 8, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9}

word = input()
N = len(word)  
total_time = 0

for _ in range(N):
    count = eng_num[word[_]]
    total_time += count + 1 

print(total_time)

그리고 전문가가 알려준 클린 코드

eng_num = {'A': 2, 'B': 2, 'C': 2, 'D': 3, 'E': 3, 'F': 3, 'G': 4, 'H': 4, 'I': 4, 'J': 5, 'K': 5, 'L': 5, 'M': 6, 'N': 6, 'O': 6, 'P': 7, 'Q': 7, 'R': 7, 'S': 7, 'T': 8, 'U': 8, 'V': 8, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9}

word = input()
total_time = 0

for char in word:
    count = eng_num[char]
    total_time += count + 1

print(total_time)

여기서 'char'의 사용이 이해가 잘 안갔는데, word열을 순회하는 변수라고 함.
때문에 변수 선언해서 굳이 N만큼 반복 지정을 할 필요가 없었던 것이다~

3. 또 다른 풀이

3-1. 접근

풀다가(=딕셔너리 노가다 하다가) 생각났는데 list로 값을 저장해 array[i] 값으로 계산하는게 빠를 것 같다는 생각이 들었다.

num_list = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']

로 리스트 설정.
1. 입력받는 값의 array[i] 위치를 받음
2. array[i]에서 i + 3 (array[0] 을 감안)

예를 들어 A값을 입력 받으면 num_list[0]임을 확인, [0]에서 0값만 빼낸 후 + 2를 하면 최단 기간 구함.

3-2. 풀이

num_list = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']

word = input()
total_time = 0

for char in word:
	for i in range(len(num_list)):
		if char in num_list[i]:
			total_time += i + 3
            break

print(total_time)

인덱스를 받아서 어찌저찌 풀었다.
아 어려워,,, 어려워,,, 어려워,,,

profile
Newbie

0개의 댓글