다중 할당 파이썬에서 다중 할당은 2개 이상의 값을 2개 이상의 변수에 동시에 할당하는 것을 말한다. 이 문제를 보면 다음과 같이 3개의 변수에 3개의 값을 할당한 바 있다. rev, rev.next, slow = slow, rev, slow.next 다음과 같이 두 줄로 분기하면 훨씬 더 가독성이 높은데, 굳이 한 줄로 처리한데에는 이유가 있다. rev, rev.next = slow, rev slow = slow.next 이렇게 두 줄로 늘어트릴 경우 rev, rev.next = slow, rev라는 구문에서 slow와 rev가 동일한 참조가 된다. 구문 중간에 rev = slow가 있으니 서로 같은 값을 참조하게 되는 것이다. 파이썬에는 원시 타입(Primiltive Types)이 존재하지 않는다. ..
팰린드롬 연결 리스트 문제 링크 code class ListNode(): def __init__(self, x): self.val = x self.next = None class Solution(): def isPalindrome(self, head: ListNode) -> bool: rev = None slow = fast = head while fast and fast.next: fast = fast.next.next rev, rev.next, slow = slow, rev, slow.next # 역순으로 연결 리스트 rev를 생성하는 로직을 slow 앞에 덧붙인다. if fast: slow = slow.next while rev and rev.val == slow.val: slow, rev = sl..
IntelliJ MAVEN + Spring MVC 기본 프로젝트 생성하기 MAVEN으로 프로젝트 생성하기 이름 설정하기 GroupID는 프로젝트에서 도메인과 같아야 된다. 예를 들어 GroupID를 com.ihp001로 할 경우 컨트롤러의 패키지 이름을 com.ihp001.Controller 같은 식으로 해야한다. Artifactid는 프로젝트 이름(Name)과 같게 만든다. Finish. Spring MVC 프레임워크 올리기 Add Framework Support을 누른다. Spring MVC 5.2.3.RELEASE 선택. OK. applicationContext.xml, dispatcher-servlet.xml, web.xml 등의 주요 파일들이 생성된다. Tomcat 설정하기 오른쪽 상단의 Add..
umask 파일이나 디렉터리 생성 시 부여되는 기본 허가권 값을 지정하는 명령이다. umask 명령을 실행하면 설정된 umask값을 확인할 수 있다. 파일의 기본 허가권은 666, 디렉터리의 기본 허가권은 777이다. 사용법 $ umask umask 확인 $ umask -S umask 문자로 확인 $ umask 022 umask 022로 변경 $ umask u=rwx,g=rw,o=rw umask의 값을 문자로 설정(011) umask로 기본 허가권 계산하기 umask 077 : 000 111 111 umask 보수 : 111 000 000 디렉터리 기본 허가권 : 111 111 111 umask 보수, 디렉터리 기본 허가권 AND 연산 : 111 000 000 → drwx------ umask 077 :..
vi 편집기 사용법 커서 이동하기 h, j, k, l로 왼쪽 아래 위 오른쪽 이동 가능하다. z[Enter] : 현재 커서가 위치한 줄을 화면의 첫줄로 만든다. n% : n퍼센트에 해당하는 줄로 이동한다. :0, :$ : 줄의 제일 처음, 끝으로 이동한다. 복사 및 붙이기 복사 및 붙이기도 정수값 n을 붙이면 여러 줄 복사나 붙이기가 된다. 예를 들면, 한줄 복사는 yy를 누르면 되는데, 커서가 위치한 줄부터 5줄을 복사하려면 5yy라 입력하면 된다. 붙여넣을 때 명령어 는 p이다. 삭제하기 삭제도 정수값 n을 붙이면 여러 줄을 지울 수 있다. 예를 들면, 한 줄 삭제는 dd를 누르면 되는데, 커서가 위치한 줄부터 5줄을 삭제하려면 5dd라고 입력하면 된다. 되돌리기 및 패턴 검색 u : 직전에 내린 명..
man 로컬 시스템에서 여러 참고 문서들을 이용하여 특정 명령이나 자원들의 메뉴얼을 출력하는 영역으로 유닉스에서는 총 8개의 영역으로 되어 있으나 리눅스 커널 부분이 추가되어 총 9개의 영역으로 구성되어 있다. Manual Section 사용법 $ man [options] [section] command [SPACE] : 한 페이지 밑으로 내려간다 [ENTER] : 한 줄 밑으로 내려간다. [b] : 전 페이지로 올라간다. [q] : man 명령을 종료한다. 주요 옵션 -k 키워드 : 해당 키워드로 발견되는 모든 매뉴얼의 내용을 검색하여 보여준다. -f 키워드 : 해당 키워드에 대한 완벽히 일치되는 매뉴얼 페이지에 대한 정보를 보여준다. -w 키워드 : man 명령 실행 시에 호출되는 '메뉴얼 페이지' ..
유니코드와 UTF-8 초기에 문자를 표현하던 대표적인 방식은 ASCⅡ 인코딩 방식으로, 1바이트에 모든 문자를 표현했다. 게다가 1비트는 체크섬으로 제외하여 7비트, 즉 128글자로 문자를 표현했다. 그러다 보니 한글이나 한자 같은 문자는 2개 이상의 특수 문자를 합쳐서 표현하곤 했는데, 당연히 이런 방식은 비정상적이며, 경우에 따라서는 깨지거나 제대로 표현되지 않는 경우가 잦았다. 이런 문제를 해결하기 위해 2~4 바이트의 공간에 여유 있게 문자를 할당하고자 등장한 방식이 바로 유니코드다. 그러나 유니코드 자체는 1바이트로 표현이 가능한 영문자도 2바이트 이상의 공간을 사용하기 때문에 이를 그대로 사용하면 메모리 낭비가 심하고 따라서 이를 가변 길이 문자 인코딩 방식으로 효율적으로 인코딩하는 대표적인 ..
X 윈도 X 윈도의 개념 및 특징 X 윈도의 역사 DEC, IBM, MIT가 공동으로 시작한 아데나 프로젝트의 일환으로 Bob Scheigler와 Jim Gettys가 1984년 최초 버전을 발표 XFree86 IBM 호환 시스템을 사용하는 유닉스 계열 운영체제를 위한 이 후 자유 소프트웨어 재단의 GPL 라이선스와 호환되지 않으면서 대부분의 개발자들이 X.org로 옮겨감 개발 중단됨 X.org X. org Server라 부름 소스가 공개된 자유 소프트웨어로 X Window System에 사용되는 디스플레이 서버 현재 거의 다 X.org Server 사용함 X 윈도의 특징 네트워크 프로토콜에 기반을 둔 그래픽 사용자 인터페이스 환경 X 윈도의 구조 X 윈도는 클라이언트/서버 구조로 되어 있고, 서로간의 ..
리눅스의 구조 부트 매니저 부팅을 도와주는 역할을 하는 프로그램 선택하여 부팅할 수 있도록 해줌 부트로더 하드디스크의 맨 앞쪽 영역인 MBR(Master Boot Record)에 설치 MBR은 부트 섹터로 디스크의 첫 번째 섹터에 해당하고 크기는 512 바이트 부트 섹터에 부트 매니저 프로그램과 파티션 정보가 기록 리눅스에서 사용하는 대표적인 부트 매니저 프로그램에는 LILO(Linux Loader)와 GRUB(Grand Unified BootLoader)가 있음 LILO는 특정 파일 시스템에 구애받지 않고 플로피 디스크와 하드디스크를 이용한 부팅을 지원 현재는 GRUB 씀. GRUB GNU 프로젝트에서 만든 부트로더 다양한 파일 시스템 지원 부팅 시에 커널 인자를 조정하여 동적인 부팅을 지원 메뉴 인터..
리눅스와 하드웨어 하드웨어의 이해 리눅스 설치를 위한 하드웨어 정보 파악 CPU 인텔사의 x86 계열 CPu 지원, 추가적으로 AMD, 모토롤라,SPARC 등 지원 정확한 모델 정보를 알아야 함 CPU 비트수 파악도 중요 CPU의 가상화 기술 지원 여부도 매우 중요 메모리(RAM) 메모리의 용량은 정확히 알고 있어야 함. 스왑 파티션 설정과 관련이 있어서 32비트 리눅스 운영체제에서는 페이징 기법의 차이로 4GB 이상의 램을 인식할 수 없음 64비트 리눅스 운영체제는 메모리 용량을 16TB 이상을 지원 하드디스크 드라이브 현존하는 대부분의 하드디스크 사용이 가능. USB, SSD도 가능 파티션 변경이나 설정, 스왑 설정 등 리눅스 시스템 ㅅ ㅏ용 중에 변경할 일 이 발생 /dev/hdx 파일 형식, /d..
리눅스 기초 리눅스의 철학 리눅스의 철학 처음 개발자인 리누스 토발즈의 주도하에 개발이 진행됨. GNU GNU's Not Unix 리철드 스톨먼을 주축으로 자유로운 스프트웨어를 희망하던 공동체들이 가장 먼저 유닉스를 모태로 개발을 시작. gcc, emacs, GNOME, GNU tar, bash, GRUB 등과 같은 다양한 분야의 응용 프로그램 만듬 FSF(Free Software Foundation)와 자유 소프트웨어 자유 소프트웨어의 생산, 보급, 발전시키기 위해 리처드 스톨만이 세운 비영리 조직. 자유 소프트웨어 프로그램을 실행시킬 수 있는 자유 프로그램이 어떻게 동작하는 지 학습하고, 필요에 따라서 프로그램을 개작할 수 있는 자유 무료 또는 유로로 프로그램을 재배포할 수 있는 자유 프로그램을 개선..
운영체제의 개요 컴퓨터 하드웨어와 컴퓨터 사용자 간의 매개체 역할을 하는 시스템 소프트웨어로 사용자가 프로그램을 수행할 수 있는 환경을 제공. 좁은 의미는 하드웨어와 응용 프로그램간의 다리 역할을 하는 커널을 의미, 넓은 의미에서는 커널, 미들웨어, 응용 프로그램 실행 환경과 사용자 인터페이스 프레임워크를 모두 포괄하여 정의 주목적은 컴퓨터 시스템을 편리하게 이용하는 것에 있고, 추가적인 목적은 PCU, 주기억장치, 입출력장치 등의 컴퓨터 하드웨어를 효율적으로 관리하는 데 있음. 운영체제의 이해 운영체제의 주요 역할 하드웨어 제어 작업의 순서 정함, 입출력 연산 제어 프로그램 실행 제어, 데이터 및 파일 저장 관리 사용자들 간의 하드웨어 자원 공유 시스템 자원을 스케줄링하여 효율적으로 활용 입출력을 쉽게..
리트코드 Group Anagrams from typing import List import collections class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: anagrams = collections.defaultdict(list) for word in strs: anagrams[''.join(sorted(word))].append(word) print(anagrams) return anagrams.values() if __name__ == '__main__': s = Solution() print(s.groupAnagrams(["eat","tea","tan","ate","nat","bat"])) sorted()는..
re 모듈 sub 함수 정규식과 매치되는 부분을 다른 문자로 바꾸어준다. sub 메서드의 첫 번째 매개변수는 바꿀 문자열이 되고, 두 번째 매개 변수는 대상 문자열이 된다. 그런데 딱 한 번만 바꾸고 싶은 경우도 있다. 이렇게 바꾸기 횟수를 제어하려면 다음과 같이 세 번째 매개변수로 count값을 넘기면 된다. import re s = "A man, a plan, a canal: Panama" s = re.sub('[^0-9a-z]', '', s) # 영어 소문자, 숫자 빼고 나머지 다 없앰. print(s) # s = "manaplanacanalanama" s = "A man, a plan, a canal: Panama" s = re.sub('[^0-9a-z]', '', s, count=1) print..
isalnum 함수 isalnum()는 영문자, 숫자 여부를 판별하는 함수 lower 함수 모두 소문자로 변환한다. class Solution: def isPalindrome(self, s: str) -> bool: strs: Deque = collections.deque() for char in s: if char.isalnum(): #영문자, 숫자 여부를 판별 strs.append(char.lower()) # 모두 소문자 변환 while len(strs) > 1: if strs.popleft() != strs.pop(): return False return True 출처 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]
typing 모듈 타입 어노테이션을 사용하다 보면 리스트, 사전, 터플, 세트와 같은 파이썬 내장 자료 구조에 대한 타입을 명시해야 할 때가 있습니다. 이럴 때는 typing 모듈에서 제공하는 List, Dict, Tuple, Set를 사용하여 타입 어노테이션을 추가한다. from typing import Deque class Solution: def isPalindrome(self, s: str) -> bool: strs: Deque = collections.deque() for char in s: if char.isalnum(): strs.append(char.lower()) while len(strs) > 1: if strs.popleft() != strs.pop(): return False ret..
제너레이터 제너레이터는 루프의 반복 동작을 제어할 수 있는 루틴 형태를 말한다. 예를 들어 임의의 조건으로 숫자 1억 개를 만들어내 계산하는 프로그램을 작성한다고 가정해보자. 이 경우 제너레이터가 없다면 메모리 어딘가에 만들어낸 숫자 1억 개를 보관하고 있어야 하낟. 그러나 제너레이터를 이용하면, 단순히 제너레이터만 생성해두고 필요할 때 언제든 숫자를 만들어낼 수 있다. 이때 yield 구문을 사용하면 제너레이터를 리턴할 수 있다. 기조느이 함수는 return 구문을 맞닥뜨리면 값을 리턴하고 모든 함수의 동작을 종료한다. 그러나 yield는 제너레이터가 여기까지 실행 중이던 값을 내보낸다는 의미로, 중간 값을 리턴한 다음 함수는 종료되지 않고 계속해서 맨 끝에 도달할 때까지 실행된다. yield의 값을 ..
locals locals()는 로컬 심볼 테이블 딕셔너리를 가져오는 메소드로 업데이트 또한 가능하다. 여기서는 딕셔너리를 가져오는 부분에 집중해 살펴보자면, 로컬에 선언된 모든 변수를 조회할 수 있는 강력한 명령이므로 디버깅에 도움이 된다. 변수명을 일일이 찾아낼 필요 없이 로컬 스코프에 정의된 모든 변수를 출력하기 떄문에 편리하다. import pprint pprint.pprint(locals()) """ {'__annotations__': {}, '__builtins__': , '__cached__': None, '__doc__': None, '__file__': '3.py', '__loader__': , '__name__': '__main__', '__package__': None, '__spec_..