코딩 스쿨에 오신것을 환영합니다~~

질의응답 게시판

 
간단한 코드질문입니다.
오 * 진 | 2019-02-08
▷ 첨부파일 : compress.py (524 Byte)      [저장]

입력받은 문자열을 갯수로 압축하는 코드를 짜라는 퀴즈를 보고 나름대로 짜본결과인데요

예를 들어서

aaaaaabbbcdd 이렇게 입력받으면 

a6b3c1d2 이렇게 문자와 문자의 갯수로 압축해서 표현되면 되는거고요


제가 쓴 코드와 다르게 이런 과정을 더 쉽게해주는 파이썬모듈이나 기능이 있는지 궁금해서 질문하게됬씁니다.


요즘 이런 파이썬코딩 퀴즈들을 풀다보니까 느낀건데 

내 마음에 드는 규칙대로 데이터를 넣고뺄수있다는 점때문에 리스트를 굉장히 많이쓰게되네요


그런데 리스트를 생성하면 메모리를 많이 쓰게 된다라는 말을 종종 봐서

코드를 짤때 리스트없이 짤 방법도 생각해 보고는 하는데 딱히 떠오르지가 않더라고요



그런데 이 리스트는 메모리가 많이 든다는 이 말은 초보자한테 굉장히 어려운 말인거 같습니다

일단 메모리라는게 뭘 의미하는지 구체적으로 모르고 
그렇다면 어떻게 하면 알수있게 되는지도 모르기 때문에 그런거같네요

이런 말을 들었을때 제 뇌가 출력해내는 말을 순차적으로 표현해보면

1. 리스트는 메모리가 많이든다? 

2. 그러면 파이썬의 다른 데이터형태들은 어떻길래 메모리를 리스트보다 덜 쓴다는 걸까?

3. 역으로 그 말이 맞다고 전제하고 간단한 예로 생각을 해보자

4. 리스트 [0,1,2,3,4,5] 를 생성하는것과 range(6) 처럼 range객체를 생성하는건 무슨 차이가 있을까?

5. 리스트는 0,1,2,3,4,5를 실제로 생성해야하고 range는 생성할 준비만 하면되서 메모리를 덜쓴다는걸까? 

6. 만약그렇다면 실제로 생성한다는게 도대체 무슨 의미인가?

7. 중학교 시절 컴퓨터교과서 수준으로 다져진 나의 기반지식은 메모리가 데이터를 저장하는 장치라고 말해준다.

8. 반도체는 전기가 통하거나 안통하게 할수있는 물질이고 컴퓨터를 반도체로 만드니까 
   이 특성을 이용해서 전기가 통하면 1 안통하면 0 이런식으로 무언가 일이 일어나도록 만들어져있다는 걸 
   얼핏 들었던 기억이 있다.

9. 그러면 리스트 [0,1,2,3,4,5]를 생성하시오는 100101010100010110111101101 뭐 이런 식이고
   range로 0,1,2,3,4,5를 생성할 준비를 하시오는 11101010 뭐 이런 식이여서
   1과 0 을 덜 사용할수 있어서 메모리를 덜 쓴다는 것인가?

10. 그러면 1과 0을 사용한다는 것이 도대체 무슨 뜻인가
    전기가 통하고 안통하고 반복하는게 도대체 무슨의미길래 이런일이 일어나고 있는건가


11. 전기 통함,안통함,안통함,통함,안통함 이라는 현상이 세상에 일어나면 'a'라는 문자가 나타나도록
    전기의 신 제우스가 철권콤보 만들듯이 미리 다 만들어 놨고
    인간이 어쩌다보니 그 철권콤보를 발견하게 됬고
    또 어떻게 어떻게 하다보니
    모래로 반도체를 만들고 지금 내 화면에 'a'라는 문자가 나타나게 된건가?

12. 도대체 메모리가 무엇인가
13. 이걸 확실하게 알고있는 사람이 있긴할까
14. 확실하게 알면서 일반인에게 설명도 해줄수 있는 사람이 있긴할까


코드 물어보러 왓다가 생각을 그냥 쓰다보니까 글이 엄청 길어져버렸네요

  • 관 * 자
  • 2019-02-08 (07:05)
첫번째 질문에 대한 답입니다.

aaaaaabbbcdd 이렇게 입력받으면  
a6b3c1d2 이렇게 문자와 문자의 갯수로 압축해서 표현되면 되는거고요.

답 : 이러한 압축 방식을 run length coding이라고 합니다. 

일단 numpy 모듈을 공부하셔야 합니다.
'python run length coding' 과 같은 키워드로 구글 검색해서 정보를 찾아보시기 바랍니다.

https://www.kaggle.com/paulorzp/run-length-encode-and-decode

를 참고해 주세요.

고수가 되는 길에 반드시 거쳐야 하는 과정 중에 하나가 고수가 짜놓은 프로그램을 보고 분석하고 흉내내는 것입니다.^^
  • 관 * 자
  • 2019-02-08 (07:23)
두 번째 리스트가 메모리를 많이 쓴다는 것에 대한 답입니다.

인터넷에서 리스트가 메모리를 많이 쓴다는 얘기는 이미지와 같은 대용량 메모리 사용이 필요할 때나 적용되는 말입니다.

결론적으로 지금 단계에서는 전혀 고민하실 필요가 없습니다.

사실 파이썬과 같이 사용하기 쉬우면서도 고성능의 프로그래밍 언어는 구조상 메모리를 다소 비효율적으로 사용할 수 있습니다. 그러나 이러한 것이 문제가 되는 건 아주 특별한 경우입니다.
이러한 경우에는 파이썬이 아니라 C나 C++와 같은 언어를 사용해야 합니다.
C 언어는 다른 언어과 비교해서 메모리를 효율적으로 사용합니다. 그래서 포인터라는 것을 사용하기 프로그래밍 시 이 메모리를 직접 제어해야해서 골머리를 앓게 됩니다. 필요하면 당연히 고생해야 겠지요.

메모리가 문제되는 경우에는 파이썬 대신 다른 프로그래밍 언어를 고려해 보아야하고 그렇지 않을경우에는 파이썬에서 메모리를 효율적으로 사용하는 방법을 고민해야 합니다.

결론적으로 리스트의 메모리 문제는 전혀 고려하실 필요가 없습니다.
고급 차를 타면서 연비를 걱정하는 것과 같습니다. 연비가 걱정되면 하이브리드 카와 같이 연비가 좋은 차를 타야합니다.

프로그래밍 언어(파이썬, C, C++, PHP, 자바, 자바스크립트, NodeJS 등)들 마다 용도가 다르고 장단점이 있습니다.

결론적으로 프로그래밍할 때 메모리는 전혀 모르셔도 되고 몰라도 전혀 지장이 없습니다.
몇 년 후 아주 고수가 되고 주어진 작은 메모리를 가지고 문제를 해결해야 하는 때에는 물론 메모리에 대한 공부도 조금하는 게 좋겠지요.

도움이 되시길...

다른 질문 있으시면 댓글에 적어 주세요.^^