정답 코드:
Phone = {'2':'ABC', '3':'DEF','4':'GHI','5':'JKL',
'6':'MNO','7':'PQRS','8':'TUV','9':'WXYZ'}
B = {v:k for k,v in Phone.items()}
A = input()
sum = 0
for i in B:
for j in A:
if str(i).count(j) != 0:
result = B.get(i)
sum += int(result)
print(sum + len(A))
코드 풀이:
코딩 테스트에서 문제를 이해하고 해결 방법을 찾는, 알고리즘을 짜는 과정은
재밌는 것 같다! 가장 먼저 문제를 보고 이해하는데 집중했고,
딕셔너리를 이용해서(객체) 문제를 해결하는 게 좋다고 판단했다,
이유는 각 번호에 알파벳을 넣는 과정에서, 반복문으로 3개씩 넣으려하니까 6번과 9번은
알파벳이 4개가 들어있다는 예외조건이 있어서 뭔가 복잡해질 것 같았고
조금 무식해보이지만 Phone 이라는 객체를 만들어 key는 숫자,
value는 알파벳으로 값을 줬다.
근데 주고 나니 딕셔너리에서 key값으로 value를 찾는건 Key.get()으로 가능하지만
value로는 찾기 복잡하다는 걸 알게 되었고,
B라는 새로운 객체를 만들어 key와 value를 바꿔서 넣어줬다.
즉, 애초에 객체를 만들 때 'ABC':'2' 이런 식으로 만들면 코드가 더 짧아지고 시간도 줄어드니
다음번엔 그렇게 해야겠다! 다만 풀이 과정 전부를 기록하고싶어서 , 또 k,v 변환
공부법을 기록하려고 정답코드에 저렇게 썼다..
A를 입력받고 ( 할머니가 기억하는 알파벳 )
sum의 초기값을 0으로 설정한 뒤
B딕셔너리를 반복문에 넣고, 입력값 A를 이중 반복문에 넣는다.
그 뒤 만약 A값이 0이 아니라면, 즉 있다면 그 key값을 sum에 더해주는 방식을
사용했다.
예를 들어 A가 ABC라면, j는 A가 되고, B 딕셔너리에서 A가 포함 된 key값은
'2'가 되기에, 이걸 정수로 바꿔 sum에 더해주는 방식이다.
WA를 이런식으로 sum에 더해주면 11이 되는데 W가 포함된 key 값은 9,
A는 2이기 때문이다.
문제에선 W를 걸기 위해선 10초,A는 3초가 걸리기에 13초가 답이 되어야하는데,
이는 가장 처음 1을 거는 초기값이 1이 아니라 2여서 이다.
즉 알파벳 1개당 1초씩이 더 걸린다고 생각하면 되기에,
len(A) 을 sum에 더해주면 답을 얻을 수 있다!
Phone = ['ABC','DEF','GHI','JKL','MNO','PQRS','TUV','WXYZ']
A = input()
time = 0
for i in range(len(Phone)):
for j in A:
if j in Phone[i]:
time += i + 3
print(time)
리스트를 이용해서 다른 방식으로도 풀어보았다.
딕셔너리는 워낙 길어서 이렇게 풀면 소요 메모리와 시간이
줄어들 줄 알고 해봤는데, 똑같았다..
풀이를 해보자면 Phone 배열에 문제에서 각 번호에 있는 알파벳들을 묶어서
같은 인덱스에 입력했고,
A를 입력 받아 이중 반복문에 적용시켰다,
i는 인덱스 확인용으로 쓸 거라, Phone의 배열 길이로 범위 지정을 하였고
입력값 A에서 입력받은 알파벳을 분리해서 j로 가져온 뒤
만약 Phone배열에 i번째 문자에 j가 있다면
time 에 그 인덱스값과 3을 더해주는 걸로 답을 얻었다.
예를 들어 j가 T라면, i는 6이고. 문제에서의 1초는 2부터 시작,
인덱스는 0부터 시작이기에 3을 더해주면 T를 거는 데 걸리는 시간
9초가 나온다.