전체 글 118

CSS (개요, 선택자, 속성, 값)

CSS, Cascading Style Sheets Cascading Style Sheets(CSS)는 HTML이나 XML(SVG, XHTML 같은 XML 방언(dialect) 포함)로 작성된 문서의 표현을 기술하기 위해 쓰이는 스타일시트 언어입니다. CSS는 요소가 화면, 종이, 음성이나 다른 매체 상에 어떻게 렌더링되어야 하는지 기술합니다. - MDN HTML5 이전 버전의 HTML에는 style을 컨트롤할 수 있는 태그(font, center)가 존재하여 CSS 없이도 어느 정도 스타일 표현이 가능했으나 정보와 구조를 담당하는 HTML 본연의 역할과 동떨어진 기능까지 추가됨으로써 복잡하고 혼란스러운 언어였다. HTML5에서는 HTML는 정보와 구조, CSS는 style의 정의라는 본연의 임무에 충실한..

다형성과 추상 타입

다형성과 추상 타입 객체 지향에서 유연하게 구현을 변경할 수 있도록 하는 방법으로 추상화가 있다. 추상화는 다형성으로 가능해진다. 다형성을 알기 위해서는 상속을 알아야 한다. 상속 개요 상속(Inheritance)은 한 타입을 그대로 사용하면서 구현을 추가할 수 있도록 해주는 방법을 제공한다. 어떤 객체가 갖고 있는 기능을 확장해 새로운 기능을 구현하고 싶을 때 상속을 사용한다. 상속 대상이 되는 클래스를 상위(super) 클래스 또는 부모 클래스라고 부른다. 상속을 받는 클래스를 하위(sub) 클래스 또는 자식 클래스라고 부른다. 자식 클래스는 부모 클래스에 정의된 구현을 물려받는다. 프로그래밍 언어마다 하위 타입에서 물려받을 수 있을 것이 다를 수 있다. 다수의 언어에서 private 범위를 갖는 메..

List 자료구조 선택하기 (LinkedList, ArrayList)

List 자료 구조 선택하기 (Java) ArrayList와 LinkedList 중 어떤 자료구조를 선택하면 좋을까? 이중 연결 리스트 구현은 ArrayList 클래스보다 시작에 요소를 추가하고 삭제하는 연산이 좋다. 끝에 요소를 추가하고 제거하는 연산은 ArrayList와 동일하다. 따라서 ArrayList 클래스의 유일한 이점은 get과 set 메서드이다. 연결 리스트는 심지어 이중 연결 리스트일 때도 선형 시간이 필요하다. 응용 프로그램의 실행 시간이 get과 set 메서드에 의존한다면 ArrayList 클래스가 좋은 선택이다. 실행 시간이 시작이나 끝 근처에 요소를 추가하거나 제거하는 연산에 의존한다면 LinkedList 클래스가 좋다. 하지만 이러한 추천은 큰 문제의 증가 차수에 기반을 두고 있..

객체 지향

객체 지향 절차 지향과 객체 지향 절차(프로시저) 지향 프로그램은 데이터를 중심으로 한 프로시저로 구성된다. 프로그램 규모가 커져서 데이터 종류가 증가하고 이를 사용하는 프로시저가 증가하게 되면, 다음과 같은 문제들이 발생하게 된다. 데이터 타입이나 의미를 변경해야 할 때, 함께 수정해야 하는 프로시저가 증가한다. 같은 데이터를 프로시저들이 서로 다른 의미로 사용하는 경우가 발생한다. 이는 결국 코드의 수정을 어렵게 만들며, 새로운 기능을 추가하는데 많은 구현 시간(즉, 개발 비용)을 투입하게 만든다. 이런 절차 지향과 달리 객체 지향 프로그램은 데이터 및 데이터와 관련된 프로시저를 객체(object)라고 불리는 단위로 묶는다. 객체는 프로시저를 실행하는데 필요한 만큼의 데이터를 가지며, 객체들이 모여 ..

문자열

문자, 문자열 문자 집합과 문자 부호화 방식 문자란 인간이 '이것은 문자라고 부르자'고 정한 기호 집합에 불과하다. 이 기호 집합을 '문자 집합', '문자 세트' 등으로 부른다. 문자 집합은 나라나 문화에 따라 다르다. 한편, 이 문자 집합을 디지털 데이터로 표현하려면 어떻게 부호화할지 정할 필요가 있다. 부호화 방법도 사람이 '이렇게 합시다'라고 정한 규칙에 불과하다. 마음대로 정해버려도 상관없는 것이다. 문자 부호화 방법의 역사를 보면 '효율이나 개인적 필요를 위해 부호화 방법을 만들자'는 세력과 '그 방법은 상호간 작업 시에 불편하니 표준화하자'는 세력 간의 치열한 다툼이 있었다. 부호화의 역사 모스 부호 On, Off, 그것의 길이를 조합으로 문자를 표현한다. 보 코드 하나의 문자를 On/Off ..

일반 2021.01.05

해시 테이블

사전(Dictionary)의 구현: 해시 테이블(Hash Table) 해시 테이블(Hash Table)은 문자열을 인수로 받아서 정수를 반환하는 '해시 함수'를 사용해서 문자열과 값의 대응 관계를 표현하는 방법이다. 값을 넣기 위해서 우선 큰 배열을 준비한다. 그리고 해쉬 함수를 사용해서 문자열을 '적당한 정수'로 변환한 후 해당 배열 어디에 넣을지를 결정한다. → 실제로 해쉬 테이블을 구현할 때 몇 가지 문제가 있다. 다른 키를 해쉬 함수에 넣었는데 가끔 같은 번지의 값을 참조하는 경우, 이를 해시 충돌(Hash Collision)이라 하며, 해결 방법으로 Chaining, Open Addressing이 있다. 공간 효율성이 떨어진다. 데이터가 저장되기 전에 미리 저장 공간..

HTML 개요

HTML은 하이퍼 텍스트 마크업 언어(Hyper Text Markup Language)이다. HTML은 웹 페이지를 위한 지배적인 마크업 언어이다. HTML은 제목, 단락, 목록 등과 같은 본문을 위한 구조적 의미를 나타내는 것뿐만 아니라 링크, 인용과 그 밖의 항목으로 구조적 문서를 만들 수 있는 방법을 제공한다. 그리고 이미지와 객체를 내장하고 대화형 양식을 생성하는 데 사용될 수 있다. HTML은 웹 페이지 콘텐츠 안의 꺾쇠() 괄호 둘러싸인 "태그"로 되어 있는 HTML 요소(HTML element) 형태로 작성한다. 하이퍼텍스트는 사용자에게 내용의 비순차적 검색이 가능하도록 제공되는 텍스트이다. 참조(하이퍼링크)를 통해 독자가 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트이다. 마크업 언..

2021년 블로그의 방향

더보기 바닐라코딩의 Prep 사전학습가이드에 나와 있는 '블로그 만들기' 글을 보고 나의 2021년 블로그 포스팅의 방향을 정립하고자 한다. 블로그를 하는 목적 내가 공부하고, 고민하고, 알아낸 것들을 기록하고 공유하기 위함이다. 공개된 곳에 게시함으로써 사람들에게 잘 읽힐 수 있는 글을 쓰도록 유도한다. 즉, 글 쓰기 실력을 키울 수 있다. 배운 것을 잘 읽히도록 정리함으로써 '아는 것을 더욱 공고히' 할 수 있다. 블로그 글 작성 요구사항 단순한 복사-붙여넣기는 지양한다. 예를 들어 책의 내용을 그대로 정리하더라도 나만의 코멘트를 달아 글을 게시한다. 출처를 반드시 밝힌다. 다른 사람들이 읽기 쉽도록 쉽고 간결하게 작성한다. 다른 사람들이 흥미를 갖도록 재미있게 작성하도록 노력한다.

일반 2021.01.04

프로그래머스 | 파이썬 | 삼각달팽이

코딩테스트 연습 - 삼각 달팽이 엄청 어려웠다. 결국 다른 사람 풀이를 참조했다. DFS/BFS 유형의 문제 같다. 풀이의 흐름 방향에 따른 좌표 값의 증감을 미리 정해둔다. 같은 방향으로 진행하면서 값을 넣어주고 범위를 벗어나려고 하면 방향을 바꾼다. 방향을 바꿀 때 방향을 그것을 3으로 나눈 나머지로 한다. 정해진 숫자만큼 칸을 다 채웠으면 리스트에 담는다. def solution(n): dx = [1, 0, -1] # 세로 dy = [0, 1, -1] # 가로 board = [[0] * (n) for _ in range(n)] count = 1 # 채울 숫자 x, y = 0, 0 direction = 0 end_count = (n * (n + 1)) / 2 while end_count >= coun..

프로그래머스 | 파이썬 | 문자열 압축

코딩테스트 연습 - 문자열 압축 나의 풀이 주어진 문자열 길이가 1이면 1을 반환한다. 문자열을 가장 길게 압축하는 길이는 문자열 절반 길이이다. 주어진 문자열을 1부터 문자열 절반 길이까지 압축한다. 주어진 문자열을 특정 간격으로 자른다. 자른 문자열을 비교하여 압축한다. 압축한 문자열의 길이를 담은 리스트(length_list)에 모든 압축한 문자열의 길이를 담는다. length_list의 최솟값을 구한다. def solution(string): length_list = [] string_length = len(string) if string_length == 1: return 1 for compress_length in range(1, string_length // 2 + 1): length_lis..