-
[백준] 17202. 핸드폰 번호 궁합 (파이썬 python)STUDY/CS 2023. 12. 30. 21:08반응형
오늘 풀어본 문제는 '다이나믹 프로그래밍', 동적 계획법을 이용한 문제였다.
다이나믹 프로그래밍 문제는 저번 스터디에서 분명히 풀어봤었음에도 불구하고 파이썬으로 시도해 보니 느낌이 또 달랐다.
문제
어린시절 다들 한 번씩은 이름으로 궁합을 본 적이 있을 것이다. 이것과 비슷한 방식으로 중앙대학교에는 핸드폰 번호 궁합을 보는 것이 유행이라고 한다.
핸드폰 번호 궁합을 보기 위해서는 먼저 궁합을 보고 싶은 두 중앙대생 A와 B의 핸드폰 번호에서 맨 앞의 010과 "-"(하이픈)을 모두 제외한 후, A부터 시작하여 한 숫자씩 번갈아가면서 적는다. 그리고 인접한 두 숫자끼리 더한 값의 일의 자리를 두 숫자의 아래에 적어나가면서 마지막에 남는 숫자 2개로 궁합률을 구하게 된다.
예를 들어, 아래의 그림과 같이 A의 번호가 010-7475-9336 이고, B의 번호가 010-3619-5974 이면, 7346715995393764에서 시작하여 070386484822030, 77314022204233, 4045424424656, 449966866011, 83852442612, 1137686873, 240344450, 64378895, 0705674, 775131, 42644, 6808, 488, 26이 되어 둘은 26%의 궁합률을 가지게 된다.
(이미지는 백준 사이트 참고)
입력
첫 번째 줄에는 궁합을 보고싶은 중앙대생 A의 핸드폰 번호가 주어진다.
두 번째 줄에는 궁합을 보고싶은 상대방 B의 핸드폰 번호가 주어진다.
핸드폰 번호는 맨 앞의 010과 "-"(하이픈)을 제외하여 숫자 8개로 주어진다.
A와 B의 핸드폰 번호는 같지 않다.
출력
A와 B의 핸드폰 번호 궁합률을 두 자리 정수로 출력한다.
십의 자리가 0이어도 앞에 0을 붙여 두 자리로 출력한다.
a = input() b = input() #string to list a_list = list(map(int, a)) b_list = list(map(int, b)) #make new list c_list = [a_list[0], b_list[0], a_list[1], b_list[1], a_list[2], b_list[2], a_list[3], b_list[3], a_list[4], b_list[4], a_list[5], b_list[5], a_list[6], b_list[6], a_list[7], b_list[7]] #length of c_list = 16 #dainamic programming while len(c_list) > 2: for i in (range(len(c_list)-1)): c_list[i] = (c_list[i] + c_list[i+1]) % 10 c_list = c_list[:-1] result_number = str(''.join(map(str, c_list))) print(result_number)
해설
입력에 맞추어 a,b를 만들었다. 그리고 a와 b를 숫자 1개가 하나의 요소인 리스트로 만든다.
그리고 c_list라는 새로운 리스트를 만든다. 여기서 for문과 if 문을 사용해 적는 게 정석 풀이법일 것 같은데 일단은 그냥 정직하게 다 적는 방식으로 리스트를 만들어 봤다.
그리고 for 함수를 이용해 본격적으로 핸드폰 번호 궁합을 계산하게 된다. 이때 범위를 c_list의 길이 -1을 해줘야 한다. 리스트 인덱스는 0부터 시작하기 때문에 이 부분을 놓치면 오류가 생길 수 있다.
c_list [i] 요소를 계산할 때도 c_list [ i ] + c_list [ i + 1 ] 계산한 값을 10으로 나눈 나머지를 사용해주어야 한다. 계산한 값이 10이 넘으면 일의 자리 수만 사용해야 하기 때문이다.
for 루프를 끝내면 c_list를 슬라이싱해서 범위를 줄인다. while 루프의 조건이 c_list의 길이가 2보다 클 때인데, 슬라이싱을 하지 않으면 요소의 개수 자체는 줄어들더라도 c_list의 길이, length가 줄어들지 않아 무한루프를 돌게 된다.
마지막으로 리스트로 존재하는 결과값을 문자열로 바꿔준다. 이때 map, join함수를 이용하면 쉽게 바꿀 수 있다. int가 아닌 str 함수를 사용해 주는 이유는, 최종 결괏값의 앞자리 숫자가 0일 때 int라면 0이 생략되어 문제의 정답 조건을 맞추지 못하기 때문이다. (02 -> 2로 표현)
결과&느낀 점
전반적으로 파이썬에 다시 익숙해지고 필요한 함수들을 떠올리는 데 시간이 걸릴 것 같다.
그래도 예전의 나보다는 조금 발전했다는 생각..
예전에는 자료형을 고려하지 않고 코드를 막 짜버려서 오류가 많이 났었는데 그런 점은 많이 고쳐진 것 같다.
c_list 만드는건 정말 막 만들었다는 생각.. 다음에 다시 해봐야지
그리고 백준은 주어진 모든 예제를 테스트해 보고 제출하자!
한 번에 맞지 못한 이유는 두 번째 예제를 확인하지 않았기 때문이니까..
반응형'STUDY > CS' 카테고리의 다른 글
웹 백엔드 프로젝트 회고 kpt | python, django 사용 (0) 2024.02.12 [백준] 24416. 알고리즘 수업 - 피보나치 수 1 (파이썬 python, pypy3) (1) 2024.01.07 [LeetCode] 412. Fizz Buzz 풀이 (python) (1) 2023.12.27 [LeetCode] 1672. Richest Customer Wealth 풀이 (java) (1) 2023.12.27 LeetCode 시작 (0) 2023.12.27