ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PCCE 모의고사 1] 10번 문제 해설
    알고리즘 이야기/프로그래머스 2022. 11. 3. 08:35

    https://school.programmers.co.kr/learn/courses/15006/lessons/121431

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    -

     

    [PCCE 모의고사 1] 10번 문제

     

    문제 설명
    애너그램(Anagram) 이란 주어진 단어를 이루는 문자의 위치를 뒤바꾸어 새로운 단어를 만드는 것을 말합니다. 애너그램을 이용해 암호화, 복호화를 하려고합니다.
    암, 복호화할 단어와 애너그램 테이블이 주어집니다. 애너그램 테이블은 단어를 암호화한 후의 문자들의 위치가 저장되어 있습니다.
    예를들어 문자열 "Hello"를 암호화  할 때, 애너그램 테이블이 [4, 2, 0, 1, 3]이면, 문자열의 0번째 값인 'H'는 애너그램 테이블의 0번째 값에 해당하는 4에 의해 4번째로 이동하고 같은 방식으로 'e'는 2번째로, 'l'은 0번째로, 'l'은 1번째로, 'o'는 3번째로 이동하여 "lleoH"가 됩니다.
    위의 방법으로 만들어진 애너그램 암호문을 복호화하려면 애너그램 테이블의 인덱스와 값의 반대 방향으로 문자열의 순서를 바꿔주면 됩니다.
    예를들어 암호화된 문자열이 "lleoH"이고 애너그램 테이블이 [4, 2, 0, 1, 3]이면, 애너그램 테이블의 0번째 값인 4에 해당하는 문자인 'H'는 해당 인덱스인 0번째로 이동하고 같은 방식으로 'e'는 1번째로, 'l'은 2번째로, 'l'은 3번째로, 'o'는 4번째로 이동하여 "Hello"가 됩니다.
    암호화할 문자열 text와 애너그램 테이블 anagram, 암호화를 할지 복호화를 할지가 저장된 변수 sw가 주어질 때 암호화 또는 복호화된 문자열을 return하도록 solution함수를 완성해 보세요.
    제한 사항
    • 5 ≤ text의 길이 = anagram의 길이 ≤ 50
    • text는 대문자와 소문자 알파벳으로 이루어진 문자열 입니다.
    • 0 ≤ anagram의 원소 < text의 길이
    • anagram의 원소는 중복되지 않습니다.
    • sw는 True또는 False입니다.
    • sw가 True이면 암호화, False이면 복호화를 해야합니다.
    입출력 예

     

    -

     

    [PCCE 모의고사 1] 10번 문제 해설

     

     우리에게는 세 개의 변수 text, anagram 그리고  sw가 주어져요. text를 sw에 따라 anagram으로 result를 만들어 내는게 목적이죠.

     

     이 문제는 '문자열(string)과 리스트(list)의 인덱스(index)에 대한 개념과, 그것을 다룰 수 있는지'를 묻는 문제에요. 코드 자체는 매우 간단하지만 생각할 거리가 있는 문제죠. 같이 살펴 볼까요?

     

     일단 text와 anagram을 먼저 볼게요. text는 문자열이고 anagram은 리스트네요. 하지만 둘 다 인덱스를 활용할 수 있죠!

     "Hello" 라는 문자열에서 각 문자(character)가 가지고 있는 인덱스를 살펴보면

    index 0 1 2 3 4
    character H e l l o

     위와 같은 표로 나타낼 수 있어요. 코드로도 확인해 볼 수 있겠죠?

     

     

     문자열의 각 문자는 인덱스를 가지고 있기 때문에 이를 이용하면 좋겠어요. 우리는 text의 모든 문자를 다 다뤄야 하니 반복문과 같이 사용하면 좋겠죠? 아래의 반복문 처럼요.

     

     

     다만 위의 코드는 파이썬 스럽진(pythonic) 않은 코드에요. 파이썬에서는 아래의 코드가 보기도 쉽고 파이썬 스럽죠.

     

     

     위 두 코드의 결과는 같아요. 하지만 두 방법 모두 알고 있어야 써먹기 좋겠죠?

     

     그런데 이 문제는 우리에게 문자 그 자체(character)와 문자의 위치(index)를 모두 요구하고 있어요. 그럼 아래와 같은 방법이 필요할 거에요.

     

     

     코드를 실행해 보면 문자의 인덱스(i)와 문자가 같이 출력되는 것을 볼 수 있어요.

     하지만 위의 코드도 파이썬 스럽진 않네요. 아래의 코드를 볼까요?

     

     

     위의 두 코드 역시 결과는 같지만 코드가 다르죠. 아래의 코드는 enumerate() 내장 함수(built-in function)는 반복 가능한 객체(iterable)의 인덱스와 인덱스에 해당하는 값을 짝지어서 튜플로 돌려주는 함수에요. 그래서 위 코드를 보면 인덱스 i와 i에 해당하는 문자 c를 다룰 수 있는 것이죠. 넘 좋죠?

     

     이제 문제를 풀 수 있는 생각의 재료들을 얻었으니 문제를 풀어볼까요?

     

    -

     

    문제 풀 준비

     

     문제를 풀 수 있는 여러 가지 방법이 있겠지만, 최대한 쉬운 방법으로 접근해 볼게요.

     이 문제는 인덱스를 차례대로 다루는 것이 아니기 때문에 먼저 리스트 result에 필요한 만큼의 '?'를 넣어놓고 시작할 거예요.

     Hello라는 글자를 암호화하면 어찌 되었든 Hello가 가지고 있는 글자 수만큼의 공간이 필요할 거니까 5개의 '?'가 필요하겠죠? 곱하기(*) 산술 연산자를 사용하면 리스트의 항목을 원하는 갯수만큼 뻥튀기 시킬 수 있어요.

     

     

     그다음, 리스트의 물음표들을 text를 이용해서 anagram에 따라 바꿔갈 거예요.

     그런데 sw에 따라서 암호화를 해야 될 수도 있고 복호화를 해야 될 수도 있으니 조건문을 만들어놓고 시작하면 좋겠네요.

     

     

     위의 코드 처럼 sw가 True와 같은지 확인하는 것도 좋지만 sw 자체가 True나 False이기 때문에, sw == True 를 sw 로만 나타내어도 좋아요. 아래의 코드처럼요.

     

     

     코드를

    -

     

    암호화

     

     먼저 암호화 부터 해 볼까요? text의 문자 하나 하나를 anagram의 따라 재배치 하기만 하면 돼요. 아래의 그림 처럼요.

    암호화

     anagram의 인덱스와 같은 곳에 위치한 text의 글자를, anagram의 항목(item)에 해당되는 위치에 가져다 놓기만 하면 되죠. anagrom의 항목이 숫자로 되어있으니까요!

     즉, anagram의 인덱스와 항목의 값이 둘 다 필요한 것이죠. enumerate() 함수를 사용하면 도움이 될 거예요. 아래의 코드를 볼게요.

     

     

     코드를 실행해 보면 anagram의 인덱스(i)와 인덱스에 위치한 항목(item)이 같이 출력되는 것을 볼 수 있어요. 우리는 이 인덱스와 항목 값을 사용해서 text에 있는 글자를 result로 옮기기만 하면 되죠. 아래의 움직이는 그림을 잘 보면 과정이 나타나 있어요.

    움직인닷..!!

     위의 움직이는 그림처럼 text의 문자를 하나씩 anagram에 해당되는 곳에 가져다 놓기만 하면 돼요. 만약 text의 'H'를 result에 옮긴다고 하면, text[0]을 result[4]에 가져다 놓으면 돼요. 이 때 result[4]는 result[anagram[0]]인 것이죠. 참 쉽죠? 아래의 코드를 볼게요.

     

     

     코드를 실행해 보면 ['l', 'l', 'e', 'o', 'H'] 가 출력되는 것을 볼 수 있어요. 문제를 풀었네요! 우리는 마지막에 이 리스트의 항목들을 문자열로 합쳐서 반환하기만 하면 돼요.

     

    -

     

     다음으로는 복호화 코드를 살펴 볼까요? 복호화는 암호화를 반대로 하기만 하면 돼요. 아래의 그림 처럼요.

    복호화

     암호화를 해냈기 때문에 복호화는 누워서 죽먹기, 식은 떡 먹기나 다름 없어요! 만약 text의 H를 result로 옮긴다고 하면, text[4]를 result[0]으로 가져다 놓으면 돼요. 아래의 코드처럼요.

     

     

     코드를 실행해 보면 result에 결괏값이 제대로 담겨잇는 것을 확인할 수 있어요.

     마지막으로 리스트에 담긴 것들을 하나의 문자열로 합쳐서 반환해주면 끝이에요. join() 함수로 가능해요.

     

     

     -

     

     enumerate() 함수를 사용하는 바람에 굉장히 쉽게 풀 수 있었어요. 하지만 나는 enumerate() 함수를 사용하지 않고 풀고 싶다! 라고 생각한다면 아래의 코드를 참고하세요!

     

Designed by Tistory.