코린이의 개발 일지

[파이썬 미로 그리기] 텍스트 파일 읽어와서 이중리스트에 담기 본문

프로젝트/콘솔 프로그램

[파이썬 미로 그리기] 텍스트 파일 읽어와서 이중리스트에 담기

폴라민 2022. 3. 13. 13:37
반응형

학교 자료구조 시간 과제로 나와서 해봤습니다.

 

처음에 c로 짜보겠다고 객기를 부리다가... 결국 갓 파이썬으로 갈아탔습니다 ㅎㅎ 

언제쯤 c를 자유자재로 잘 다룰 수 있을까요?

나름 서울 42 하는 한달간 c 되게 많이 늘었다 생각했는데, 아직 멀었나 봅니다...

 

 

암튼 시작하겠습니다.

 

과제 내용이 텍스트 파일에 있는 미로를 읽어와서 배열에 담은 후 다시 그 배열 내용을 읽어서 미로를 출력하는 것이었습니다.

이때 배열에 담을 때 최대한 바이트 수를 적게 쓰는 것이 과제의 목표였습니다.

 

자 우선 텍스트 파일을 읽어와야겠죠?

관련 내용은 이전에 포스팅해놓았던 글을 참고 하시면 좋을 거 같습니다.

 

https://polarmin.tistory.com/36

 

[파이썬 파일 입출력] - 텍스트 파일 읽어오기

오늘은 학교 과제 할 때 텍스트 파일 읽어와야할 부분이 있어서 이 내용을 포스팅해봤습니다. 그럼 거두절미하고 바로 시작해 보겠습니다. 텍스트 파일을 읽어오기 위해서 open 메소드를 사용했

polarmin.tistory.com

 

위에 첨부해 두겠습니다.

 

9 12
+-------+-------+-+
|       |       | |
| +---+ +---+ + | |
|     | |     | | |
+---+ + + +-+ | | |
|     |   |   | | |
| +-+ +-+-+ +-+ + |
| | | | | | |     |
| | +-+ | +-+ +-+ |
| | |   |     |   |
| + | + +---+-+ + |
|   | |     |   | |
| +-+ | +---+---+ |
|     | |         |
+-+---+ | +---+ + |
| |     | |     | |
| | +---+ | +---+-+
| |       |       |
| +---+ +-+-+ +-+ |
|     |   | | | | |
| +-+ | + | +-+ | |
|   | | | |     | |
+-+ | + | + +---+ |
|   |   |   |     |
+---+---+---+-----+

 

파일이 위와 같이 있는데 저는 우선 첫줄과 마지막 줄. 그리고 양 옆의 벽을 다 날리고 저장했습니다. 사실 4개의 벽은 주변 문자를 알면 충분히 유추할 수 있기 때문에

 

       |       | 
 +---+ +---+ + | 
     | |     | | 
---+ + + +-+ | | 
     |   |   | | 
 +-+ +-+-+ +-+ + 
 | | | | | |     
 | +-+ | +-+ +-+ 
 | |   |     |   
 + | + +---+-+ + 
   | |     |   | 
 +-+ | +---+---+ 
     | |         
-+---+ | +---+ + 
 |     | |     | 
 | +---+ | +---+-
 |       |       
 +---+ +-+-+ +-+ 
     |   | | | | 
 +-+ | + | +-+ | 
   | | | |     | 
-+ | + | + +---+ 
   |   |   |

그럼 이런식으로 저장이 되는데 여기서 보시면 맨 위 줄을 0번째 줄이라고 했을 때 짝수행들은 '|' 이 문자만 있습니다. 따라서 문자를 저장할 필요 없이 인덱스만 저장을 했고, 

 

홀수 행의 경우는 '-' 문자가 반복되는 경우 즉 '---'이렇게 세개가 반복되면 그냥 3 으로 저장했습니다.

 

그리고 마지막으로 '+' 뒤에 ' ' 인 경우는 두 문자를 합쳐서 'a'로 저장

'+' '-' 가 연속된 경우 두 문자를 합쳐 'b'로 저장

'|' ' ' 가 연속된 경우 두 문자를 합쳐 'c'로 저장했습니다.

 

이렇게 row 한줄을 하나의 리스트로 만들고 그 리스트들을 다시 이중 리스트에 담아 저장을 했습니다.

 

최종 변환한 리스트를 출력해 보면 아래와 같이 나옵니다.

 

[8, 12, 20]
['-', 'a', 'b', 'a', 'c', 'a', '+', '3', 'a', 'a']
[4, 6, 8, 10, 18]
[' ', 'b', 'a', 'c', 'c', 'c', '+', '5', 'b']
[4, 6, 8, 10, 12]
['-', 'a', 'c', 'c', 'c', 'b', 'a', 'b', 'b', 'a']
[4, 6, 8, 12, 16, 18]
[' ', 'b', 'a', 'a', 'b', 'a', 'b', 'a', 'c', 'c']
[2, 12, 16, 18]
[' ', '+', '5', 'a', 'b', 'a', 'b', 'a', 'a']
[2, 8, 10, 16]
[' ', 'a', 'b', 'a', 'c', 'c', 'b', 'b', 'a', 'b']
[6, 8, 10, 12, 14, 18]
[' ', '+', '3', 'a', 'b', 'a', 'c', 'c', 'b', 'a']
[2, 6, 10, 12, 14]
[' ', 'a', 'a', 'c', 'a', 'c', 'c', '+', '3', 'a']
[4, 6, 8, 10, 12]
['3', 'a', 'c', 'c', 'a', '+', '5', 'a']
[6, 8, 18]

 

저 미로를 그대로 저장하면 513바이트 정도 나오는데, 위의 방식으로 하면 132바이트로 줄어듭니다. 

이렇게 반복되는 문자가 많은 경우는 이런 방식으로 저장하는 메모리를 줄일 수 있을 거 같네요.

 

소스코드는 아래의 깃허브에 올려놓았으니 궁금하신 분들은 들어가서 코드 가져다가 한번 실행해 보시길 바랍니다.

https://github.com/leesunmin1231/Data_structure/tree/master/assignment_1

 

GitHub - leesunmin1231/Data_structure: Data structure assignment

Data structure assignment. Contribute to leesunmin1231/Data_structure development by creating an account on GitHub.

github.com

 

반응형
Comments