ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 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 만드는건 정말 막 만들었다는 생각.. 다음에 다시 해봐야지

    그리고 백준은 주어진 모든 예제를 테스트해 보고 제출하자!

    한 번에 맞지 못한 이유는 두 번째 예제를 확인하지 않았기 때문이니까..

    반응형
Designed by Tistory.