일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- git checkout
- React.js
- 비디오 스트리밍
- Server Side Rendering
- beautifulsoup
- 멘션 추천 기능
- Image 컴포넌트
- 브라우저 동작
- 네이버 부캠
- PubSub 패턴
- react
- 네이버 부스트캠프 멤버십
- 파이썬
- 자바 프로젝트
- React ssr
- Next.js
- 코딩테스트
- 스택
- 자바스크립트
- 자바스크립트 객체
- 프로그래머스
- 웹크롤링
- c++
- 네이버 부스트캠프
- Next/Image 캐싱
- 파이썬 코딩테스트
- 파이썬 웹크롤링
- 씨쁠쁠
- 자바스크립트 컴파일
- 부스트캠프
- Today
- Total
코린이의 개발 일지
[파이썬 미로 그리기] 텍스트 파일 읽어와서 이중리스트에 담기 본문
학교 자료구조 시간 과제로 나와서 해봤습니다.
처음에 c로 짜보겠다고 객기를 부리다가... 결국 갓 파이썬으로 갈아탔습니다 ㅎㅎ
언제쯤 c를 자유자재로 잘 다룰 수 있을까요?
나름 서울 42 하는 한달간 c 되게 많이 늘었다 생각했는데, 아직 멀었나 봅니다...
암튼 시작하겠습니다.
과제 내용이 텍스트 파일에 있는 미로를 읽어와서 배열에 담은 후 다시 그 배열 내용을 읽어서 미로를 출력하는 것이었습니다.
이때 배열에 담을 때 최대한 바이트 수를 적게 쓰는 것이 과제의 목표였습니다.
자 우선 텍스트 파일을 읽어와야겠죠?
관련 내용은 이전에 포스팅해놓았던 글을 참고 하시면 좋을 거 같습니다.
https://polarmin.tistory.com/36
위에 첨부해 두겠습니다.
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
'프로젝트 > 콘솔 프로그램' 카테고리의 다른 글
[자바] 콘솔로 간단한 보드게임 만들기 - 구현편 (0) | 2022.06.19 |
---|---|
[자바] 콘솔로 간단한 보드게임 만들기 - 설계편 (0) | 2022.06.13 |
[파이썬 웹크롤링] 파이썬으로 네이버 웹툰 목록 가져와서 별점순 정렬하기 (BeautifulSoup) (1) | 2022.01.24 |
[파이썬 웹크롤링] 파이썬으로 네이버 웹툰 제목 목록 가져오기 - BeautifulSoup 사용 (0) | 2022.01.23 |
[파이썬 웹크롤링] - 웹페이지 텍스트 내용 가져오기 (BeautifulSoup 사용) (0) | 2022.01.22 |