0xffffffff의 등록된 링크

 0xffffffff로 등록된 티스토리 포스트 수는 93건입니다.

[JS / ECMAScript] 왜 React / Next.js를 써야하는가? 쓰지 말아야 하는가? [내부링크]

1. 개요 React는 유저 간의 상호작용을 위하여 만들어진, 유명한 JS 라이브러리로 Facebook에 의하여 발전하고 유지보수되고 있는 라이브러리이다. Next.js는 React 위에 개발된 프레임워크로 서버에서 렌더링된 React 어플리케이션을 가능케 할 뿐만 아니라 자동 code splitting, 내장된 개발 환경을 제공한다. 이번 글은 React와 Next.js으로 웹 어플리케이션을 만들었을 때의 장점과 단점에 대한 분석을 제공한다. 2. React의 장점 React의 장점은 다음과 같은 것들이 존재한다. 2-1) Virtual DOM React는 유저 인터페이스의 변화와 업데이트 성능을 위하여 가상 DOM(virtual Document Object Model)을 사용한다. 가상 DOM은 실제..

[JS / ECMAScript] 동시성과 이벤트 처리 문제에 대한 탐구. - 1. Node.js의 구조, Event Loop의 원리와 구조 [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. 2023.01.08 - [Javascript] - [JS / ECMAScript] 비동기 처리를 조금 더 효율적으로 해보자. 2. 2023.01.26 - [모두보기] - 동시성과 이벤트 처리 문제에 대한 탐구. - 0. GIL vs Proactor/Reactor JavaScript는 기본적으로 싱글 쓰레드 언어이다. 즉, 쓰레드를 여러 개 열 수 없고 동시에 여러 개의 일을 처리하려면 새로운 런타임을 생성해야한다는 암시를 가진다. 그러나, Node.js는 I/O 작업이나 커널에 접근해야 하는 작업이 생긴다면 이를 비동기로 처리가 가능하다. 생각해보면 JS는 싱글 쓰레드인데 어떻게 서버로 괜찮은 성능..

동시성과 이벤트 처리 문제에 대한 탐구. - 0. GIL vs Proactor/Reactor [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. 2023.01.08 - [Javascript] - [JS / ECMAScript] 비동기 처리를 조금 더 효율적으로 해보자. 자바스크립트는 싱글 쓰레드 언어이다. 따라서, 쓰레드를 새로 만든다건가, 이벤트를 처리할 때 한 번에 단 한번의 이벤트만 처리할 수 있다. 그러나, 현대 언어는 이벤트 핸들링을 위하여 여러 가지 방법 및 디자인 패턴을 발전시켰고, 이를 알기 위해서는 여러 사전지식을 갖추어야 한다. Node.js나 Dart / Flutter에서 사용하는 event loop, 파이썬에서 활용하는 Global Interpreter Lock 등도 여러 배경 속에서 탄생한 이벤트 처리 방법이다. 이벤..

[JS / ECMAScript] 패키지 설치와 의존성, npm, yarn에 관한 고찰 [내부링크]

Node.js와 그에 파생된 여러 프레임워크를 사용하다 보면, 패키지 설치와 의존성 관리를 담당하는 패키지 매니저를 자주 볼 수 있다. (package.json으로부터 비롯된 매니징 툴 npm, yarn, pnpm 등등...) 다만, 이러한 라이브러리 패키지 매니징과 node_modules 폴더에 대한 깊은 고찰을 한 적은 없어서 이번 글을 통해 해보려 한다. 이번 글에서는 npm, yarn의 역사와 의존성, 패키지 관리에 대하여 살펴보자. 1. import, require는 Node.js에서 어떤 원리로 동작하는가? 현대 JS에서 사용하고 있는 모듈 불러오기 문법은 두 가지가 있다. Import 문과 Require 문이 그 둘이다. 두 문법에는 여러 작은 차이가 있지만, 이번 글의 목적은 두 문구의 비..

[React] useMemo를 활용하여 성능을 향상시켜보자. [내부링크]

최근 React를 활용한 웹사이트를 만드는 데, 급격한 스크롤을 할 시 성능이 급격하게 내려간 현상을 발견할 수 있었다. 마우스 관련 이벤트에 쓰로틀을 걸어도, 디바운스를 활용해도 성능이 개선되지 않았으나, useMemo를 활용하여 성능을 개선시킬 수 있었다. 그 컴포넌트는 무거운 연산을 하는데 컴포넌트가 다시 렌더링될때마다 다시 무거운 연산을 하기 때문이었던걸로 문제가 발생했기 때문이다. useMemo을 활용한 성능 차이를 알아보자. 1. useMemo useMemo는 React에서 공식적으로 제공하는 hook의 일종으로, 컴포넌트에서 이미 계산된 값을 재사용할 시 활용가능한 함수이다. 즉, 만약 어떠한 이벤트 때문에 React가 컴포넌트를 리렌더링해야 하는 경우 useMemo를 활용하여 자원이 많이 ..

[JS / ECMAScript] 비동기 처리를 조금 더 효율적으로 해보자. [내부링크]

JS의 쓰임새 중 많은 부분을 차지하고 있는 부분은 "비동기 처리"이다. JS에서는 비동기 처리 방식을 크게 3가지로 구분짓는다. 첫 번째는 콜백 함수, 두 번째는 프로미스, 세 번째는 async/await이다. 이 중 가독성과 편의성을 위해서 보통 두 번째 방법과 세 번째 방법을 섞어서 사용하는 방법을 위주로 현대에선 사용한다. 여러 JS 앱들을 만들었을 경우, 반드시 한 번 쯤은 비동기 처리 관련 코드를 작성해봤을 것이고, JS의 비동기 처리 3가지를 안다고 해서 비동기 처리 관련 코드를 만드는 것과 효율적인 비동기 처리 관련 코드를 만드는 것은 다른 의미를 지니고 있다고 생각한다. 일단, 비동기 처리에 대한 기본 지식(콜백 함수, 프로미스, async/await)에 대한 지식을 가지고 있다는 전제 ..

[CSAPP] 2. Bomb lab (Assembly Reversing & GDB Tool) - Phase 5 [내부링크]

다른 phase와 다르게, phase 5는 조금 특별하다. 왜 그런지는 문제와 함께 살펴보자. 하던대로, phase_5의 함수부터 분해하여보자! 0000000000401062 : 401062:53 push %rbx 401063:48 83 ec 20 sub $0x20,%rsp 401067:48 89 fb mov %rdi,%rbx 40106a:64 48 8b 04 25 28 00 mov %fs:0x28,%rax 401071:00 00 401073:48 89 44 24 18 mov %rax,0x18(%rsp) 401078:31 c0 xor %eax,%eax 40107a:e8 9c 02 00 00 callq 40131b 40107f:83 f8 06 cmp $0x6,%eax 401082:74 4e je 4010d..

[CSAPP] 2. Bomb lab (Assembly Reversing & GDB Tool) - Phase 4 [내부링크]

이제까진 그래도 괜찮았다. 근데, phase 4부터는 난이도가 조금 어려워진다. 사실 꼼수는 많이 있지만, 정확히 알고가기에는어려운 부분이 많이 있었다. 각설은 여기까지만 하고, 일단 하던대로 함수 phase_4부터 분해하여보자. 000000000040100c : 40100c:48 83 ec 18 sub $0x18,%rsp 401010:48 8d 4c 24 0c lea 0xc(%rsp),%rcx 401015:48 8d 54 24 08 lea 0x8(%rsp),%rdx 40101a:be cf 25 40 00 mov $0x4025cf,%esi 40101f:b8 00 00 00 00 mov $0x0,%eax 401024:e8 c7 fb ff ff callq 400bf0 401029:83 f8 02 cmp $0..

[CSAPP] 2. Bomb lab (Assembly Reversing & GDB Tool) - Phase 3 [내부링크]

세 번째 phase를 살펴보자. 가보자 가보자! phase_3 함수를 어셈블리어로 추출하여보자. 0000000000400f43 : 400f43:48 83 ec 18 sub $0x18,%rsp 400f47:48 8d 4c 24 0c lea 0xc(%rsp),%rcx 400f4c:48 8d 54 24 08 lea 0x8(%rsp),%rdx 400f51:be cf 25 40 00 mov $0x4025cf,%esi 400f56:b8 00 00 00 00 mov $0x0,%eax 400f5b:e8 90 fc ff ff call 400bf0 400f60:83 f8 01 cmp $0x1,%eax 400f63:7f 05 jg 400f6a 400f65:e8 d0 04 00 00 call 40143a 400f6a:83 7..

[CSAPP] 2. Bomb lab (Assembly Reversing & GDB Tool) - Phase 2 [내부링크]

두 번째 phase를 살펴보자. 일단, phase_2를 "(gdb) $ disas phase_2" 명령어로 어셈블리어를 추출하여보자. 0000000000400efc : 400efc:55 push %rbp 400efd:53 push %rbx 400efe:48 83 ec 28 sub $0x28,%rsp 400f02:48 89 e6 mov %rsp,%rsi 400f05:e8 52 05 00 00 call 40145c 400f0a:83 3c 24 01 cmpl $0x1,(%rsp) 400f0e:74 20 je 400f30 400f10:e8 25 05 00 00 call 40143a 400f15:eb 19 jmp 400f30 400f17:8b 43 fc mov -0x4(%rbx),%eax 400f1a:01 c0 ..

[CSAPP] 2. Bomb lab (Assembly Reversing & GDB Tool) - Settings & Phase 1 [내부링크]

CSAPP 랩의 두 번째 실습은 bomb lab이다. "폭탄 랩"이라는 무시무시한 이름을 달고 있고, 실제 난이도도 무시무시하게 어렵다. 왜냐면 object code를 리버싱하여, 각 레지스터에 담긴 데이터를 확인한 다음, 각 레지스터에 알맞은 값이 있도록 해야하기 때문이다. 이 랩의 목적은 binary 파일인 "bomb"을 해제하는 것이다. 정확히 말하면, 각 함수에 대하여 알맞은 input을 넣어주어야 하며, 알맞은 input은 어셈블리어를 분석하여 알 수 있다. 이번 실습의 특이한 점으로는 실수를 허용하지 않는다는 것이다. 만약 잘못된 input을 넣을 경우, "폭탄이 터진다". 실시간으로 폭탄이 터지는 횟수를 세며, 만약 폭탄이 터질 경우 0.5점이 감점된다. 즉 2번 터뜨릴때마다 1점 감점이라는..

[Docker] 도커(docker) 딥 다이브 #2 [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Docker] 도커(Docker) 딥 다이브 #1 지난 글에 간단하게 도커의 구조를 알아보았다. 이번에는 직접 도커를 사용해보며 도커에 대한 감을 익혀보자. 1. Push & Pull 도커는 이미지를 통해 컨테이너를 생성하고 실행한다. 이미지는 도커가 직접 운영하는 docker-hub에서 받을 수도 있고, 혹은 서드 파티 허브인 github packages, AWS ECR, GCP CR, local registry 등등 여러 곳에서 받을 수 있다. docker에서 이미지를 받기 위해선 다음 명령어를 사용한다. docker pull 만약 dockerhub가 아닌 레지스트리에서 다운받기 위해선 다음 ..

[Docker] 도커(Docker) 딥 다이브 #1 [내부링크]

바야흐로 가상화의 시대이다. 여러 프로그램들을 가상 운영체제에 올려 가동을 시킨다. 이제는 VM을 포함한 한 대의 서버에서 여러 개의 서비스를 구동할 수 있는 시대가 온 것이다. 이러한 시대는 "사실 상 업계표준"인 도커(Docker)에서 시작되었으며, 현재 컨테이너 기술의 선두 주자라도 봐도 무방할 만큼 도커가 가상화 및 컨테이너 시장에 미친 영향은 어마어마하다. 그러나, 사실 도커가 어떤 시대정신에 맞추어 탄생하였는지, 이에 대한 맥락을 이해하면서 쓰는 것과 모른 채 쓰는 것은 매우 큰 차이가 있다고 생각한다. 이에 따라, 도커의 밑바닥부터 들어가보자. 파란 고래를 따라 바닥으로 들어가보자. 1. TCP/IP 5계층부터 살펴보자. 사실, 도커의 기술 80%는 네트워크 기술을 기반으로 두고 있다고 해도..

[JS / ECMAScript ] JS에는 변수의 생명주기가 어떻게 될까? 호이스팅을 중심으로 [내부링크]

사실, JS는 "적당히" 코드를 컴퓨터에 던져주면, "적당히" 실행시켜주고, 어느정도 사용자가 기대하는 만큼 작동하는 언어이다. 따라서, JS 진영은 다른 언어 진영에 비해 JS에 대한 탐구를 깊게 하는 경우를 보지 못하였고, 특히 호이스팅과 같이 JS 관련 여러 개념은 알고 있지만, 이에 대한 탐구는 깊게 하는 사용자들이 그렇게 많아 보이지 않았다. 이번 글에서는 프로그래밍의 가장 근간이 되지만, 가장 알기 어렵고 헷갈리기 쉬운 변수에 대하여 알아보고, 이에 대한 생명 주기를 알아보자. (You don't know JS를 기반으로 작성되었습니다!) 1.변수는 언제 사용 가능한가? 자명한 답변이지만, 어느 언어에서나 변수는 언제 사용가능한가라고 물어보면 선언된 이후라 할 수 있다. 다음과 같은 예제를 보..

[JS / ECMAScript] DOMParser에 대하여 알아보자. [내부링크]

얼마전 팀원들끼리 스프린트로 DOM visualizer를 하기로 하였는데, 나는 이 주제를 2주 안에 구현하는데 실패하였다...(진짜로 시간이 없었다. 진짜로...) 이에 대한 참회의 의미로 DOM에 관련된 글을 작성하기로 하였고, 나는 DOM 관련 주제로 DOMParser API에 대하여 간단하게 설명하고자 한다. 가보자 가보자! 1. DOMParser API DOMParser API는 HTML 혹은 XML 소스 코드를 DOM으로 분석하고 파싱할 수 있는 API의 묶음이다. 다른 말로, DOMParser를 이용하면 문자열 꼴로 이루어진 XML, HTML 소스코드를 DOM 구조로 변환할 수 있다는 이야기이다. 반대로 DOM tree를 XML이나 HTML로 바꾸려면 XMLSerializer를 활용하면 된다..

[JS / React] React Hooks는 좋은 업데이트인가? [내부링크]

한 달 전, React 개발팀은 6개월 전 많은 리액트 사용자들을 설레게 한, 'useEvent'라는 실험적인 hook 개발을 취소하였다. 이후에 설명하겠지만, 'useEvent' 훅은 기존 컴포넌트 재렌더링 관련 문제를 해결할 수 있는, 하나의 은탄이 되리라 많은 기대를 모았었다. 그러나 React 팀은 저번 달 이에 대한 관련 github 논의 글을 closed 하였고, React 팀은 "다른 방식으로 사용 가능하고, 다른 문법으로, 다른 이름으로 재출시될 수 있다."라고 못 박았다. 내 귀에는 "useEvent 훅을 없애갰다."라는 의미로밖에 들리지 않았다. 이게 어떤 사정이 있길 래 취소되었는지, 어떤 방향으로 새로 개발될지는 리액트 개발팀만이 알고 있겠지만, 이는 React Hooks가 가진 단..

[JS] 구글에게 점수따는 족보, lighthouse에 대하여 알아보자. [내부링크]

블로그를 하거나, 웹사이트 관리자라면 SEO(Search Engine Optimization)에 관한 이야기를 한 번쯤은 들어본 적이 있을것이다. SEO는 간단하게 말하자면, 구글에게 좋은 점수를 따는 방법이다. 좋은 점수를 딸수록 검색어 순위에서 올라가고, 점수를 따지 못하거나 구글의 기준을 넘지 못하면 검색어 순위가 내려가거나 검색에서 제외된다. 크롬 개발자들은 각 웹사이트마다 점수화하여, 얼마나 사용자 친화적인지, 얼마나 속도가 빠른지, 얼마나 접근성이 좋은지, 또한 SEO에 얼마나 최적화되어있는지에 대하여 보고서를 만들어주는 앱을 만들었으니, 이것이 lighthouse되겠다. 이번 포스팅에서는 lighthouse에 대하여 가볍지만, 웹 개발자 입장에서 가볍지 않게 들어가보자. 1. Lighthou..

[JS/ECMAScript] JS만의 재밌는(?) 타입 변환에 대하여 알아보자. [내부링크]

JS는 Python 혹은 Ruby 처럼 동적 타입 언어이다. 즉, 타입이 컴파일 시에 결정되는 것이 아닌, 런타임에서 결정되는 언어이다. 그러나, 다른 동적 언어와 달리, JS는 매우 특이한 타입 변환을 지원한다. JS의 타입 변환은 다른 언어와 다르게 기상천외한, 정말 기상천외한 방법으로 진행되니, 이에 대하여 정리가 필요할 것 같아 글을 작성하게 되었다. JS의 타입부터 살펴보고, 각 타입이 어떻게 변환되는 지 알아보자. 중간에 흐름을 놓치게 되면 이해가 되지 않는 부분이 있으니 천천히 따라와 주시길. 1. JS의 타입 JS의 타입은 다음과 같이 7+1개가 있다. 이를 머리속에 넣고 가보자. 1. 원시 타입 - 불리언 타입 (true, false) - Null 타입 (null) - Undefined ..

[Network] HTTP Response Status Code 한 방 정리 [내부링크]

팀원들과 세미나를 진행하던 중, NodeJS로 서버를 구축 한 이후, HTTP로 쿼리, 응답을 받는 과정 중 "일단 404, 200으로만 상태 코드를 반환하자."는 말이 있었다. 사실 자주 쓰이는 404 Not Found, 400 Bad Request, 200 OK등등 자주 사용하는 상태코드는 외우고 있지만, 이 밖에 상태 코드는 찾아봐야 할 정도로 모르기 때문에, 한 번 정리해야겠다는 차원으로 이 포스팅을 작성하게 되었다. HTTP Status Code를 하나하나 살펴보자. 1. HTTP Status Code HTTP는 기본적으로 stateless 하기에 이전 요청과 상관없이 새 요청마다 새로운 응답을 받는다. 따라서, 각 요청마다 잘 되었는지, 어떤 상태인지 알려주는 약속이 대두되었고, 이는 HTTP..

[JS / ECMAScript] var과 let (const)에는 성능 차이가 있을까? [내부링크]

Javascript에서는 변수를 선언하는 세 가지 키워드가 있다. 고전 JS부터 이어진 var와, ES6에서 새로 도입된 키워드 const, let이 있다. 현재 많은 JS 개발자들이 var 대신 const, let을 권장하고 있지만, 아직 많은 고전 JS 코드에서 var를 사용하는 경우도 많다. 임의의 변수를 let과 const로 선언할 경우 var보다 많은 장점이 존재한다. 예를 들어, 호이스팅 문제에서 자유롭거나, 중복된 변수 방지 등등 활용할 수 있다. var, let, const을 비교한 글은 여러 블로그에서 찾을 수 있으니, 구글에서 이에 대하여 검색하면 쉽게 얻을 수 있다. (만약 귀찮다면, 다음 글을 참고하면 된다.) 그러면, var가 let과 const를 사용하는 경우보다 나은 경우가 존..

[Network] DNS(Domain Name Service)에 관한 모든 것 [내부링크]

컴퓨터가 브라우저에서 웹을 접속하는 첫 과정으로, 웹 브라우저에 웹사이트 주소(예를 들어, https://www.google.com)를 입력하면 실제 홈페이지가 열린다. 근데, 생각해보면 모든 서버는 고유한 주소(IP 주소)로 이루어져 있다. 그럼, 브라우저에 "https://www.google.com"를 입력하면 이것이 IP 주소로 자동 변환되는 것인가? 브라우저에 모든 서버에 대한 주소를 담고 있는 것인가? 모든 서버에 대한 주소를 담고 있으면, 새로 생성된 서버에 대한 주소는 누가 가지고 있는 것인가? 우리가 모르는 번호가 있으면 전화로 114에 물어보고, 모르는 것이 있으면 구글링이 있듯이, 브라우저도 해당 주소에 대하여 모르면 "구글링"을 수행한다. 이때, 114 안내소, 구글 검색처럼 홈페이지..

[Python] return 문에도 and 와 or를 사용할 수 있다고? 파이썬의 and과 or에 대한 모든 것 [내부링크]

파이썬만의 독특한 문법으로 파이썬은 함수의 return문에도 and와 or를 사용할 수 있다. 다만, 이 경우 보통우리가 생각하는 and와 or과 같이 동작을 하지 않는다. 이를 이해하려면 and와 or의 정확한 동작원리 및 우선순위에 대한 탐구가 필요하다. 이번 포스팅에서 함께 알아보도록 하자. 1. and와 or의 우선순위 정리 파이썬 공식 문서에 따르면, and와 or, not의 정확한 우선순위는 다음과 같이 쓴다. 위에 있을 수록 더 높은 우선순위를 갖는다. 연산자 작동 원리 우선순위 x OR y (또는 연산자) if x is FALSE, then y, else x 1 x AND y (그리고 연산자) if x is FALSE, then x, else y 2 NOT x (부정 연산자) if x if..

[Python] 파이썬의 별표(*, asterisk)에 대한 모든 것 [내부링크]

파이썬을 다루다 보면 곱셈 연산 이외에 별표(*)가 쓰인 경우가 있다. 이럴 때 쓰이는 별표는 어떤 의미를 가질까? 가령 파이썬의 함수에 대하여 배웠다면 다음과 같이 매개변수에 별표(*args)가 붙는 경우를 볼 수 있다. HTML 삽입 미리보기할 수 없는 소스 왜 이런 꼴이 가능할까? 이번 포스팅에서는 파이썬의 별표, 즉 asterisk 연산자의 다양한 활용에 대하여 알아보자. 1. *operator 파이썬에서의 별표(*) 연산자, 혹은 asterisk 연산자는 집합 형태의 자료형을 풀거나, 묶을 때 사용하는 연산자이다. 우린 이를 unpacking, packing 연산자라 부르기로 하였다. 다음과 같이 하나의 list가 있다고 가정하자. new_list = [1, 2, 3, 4, 5] 이때 new_l..

[Python] 리스트 함축(list comprehension)을 시작부터 끝까지 이해하여보자. [내부링크]

파이썬에서의 list를 야무지게 사용하는 방법 중 하나는 리스트 함축(list comprehension)이다. 이 또한 파이썬 이외에 언어에서는 찾아볼 수 없는, 독특한 문법 중 하나이다. list를 새로 생성할 때 매우 유용하게 사용할 수 있으며, 특히 코드의 가독성을 높이고 코드의 길이를 짧게 할 때 유용하게 사용할 수 있는 테크닉이다. 이번 포스팅에서는 리스트 함축에 대하여 알아보고 이를 극한까지 활용하여보자. 1. list comprehension이란? 파이썬 공식 문서에는 리스트 함축(list comprehension)에 대한 정의를 다음과 같이 하고 있다. List comprehension은 list를 생성하는데 하나의 간결한 방법을 제공하는 방법입니다. 다른 sequence 혹은 iterab..

[Python] 가변, 불변(mutable, immutable)에 대한 모든 것 [내부링크]

파이썬에는 다른 언어에서는 찾아볼 수 없는 특징들이 몇 가지 있는데, 대표적으로 파이썬은 모든 객체를 가변 객체(mutable object), 불변 객체(immutable object) 두 종류의 객체로 구분하고 있다. 어렵지 않은 개념이지만, 중요한 개념이므로 이번 포스팅에서 간략하게 정리하고 간다. 1. 가변(mutable) vs 불변(immutable) 먼저, 가변 객체와 불변 객체에 대한 이해를 하여보자. 불변적 객체(immutable)란, 메모리 안에 담겨 있는 값이 언제나 변하지 않는 객체를 의미한다. 예를 들면, 다음과 같은 종류들은 불변 객체이다. 정수형(int) & 불리언형(boolean) 실수형(float) 복소수형(complex) 문자열형(string) 튜플형(tuple) 바이트형(b..

[Python] 파이썬은 포인터가 존재하지 않을까? (부제 : id 함수에 관한 모든 것) [내부링크]

파이썬을 공부하다 보면 C / C++ 언어와 다르게 포인터라는 개념을 전혀 마주친 경험이 없을 것이다. 정상이다. 파이썬은 포인터라는 개념을 직접 활용하지 않는다. 물론, 파이썬에도 포인터에서 파생된 개념(예를 들어, call by value, call by reference...) 활용하긴 하지만, 직접 사용자가 쉽게 메모리에 접근할 수 있는 방법은 따로 없다. 그럼, 파이썬은 어떻게 변수에 데이터를 저장하는가? '='의 역할은 무엇인가? 또한, 이때 내부적으로 파이썬은 포인터를 활용할까? 이번 포스팅에서는 이에 대한 답을 알아보자. 1. id 함수란? 파이썬의 내장 함수 중에는 id라는 함수가 존재한다. 이 함수의 역할을 매우 간단하다. 객체의 고윳값(identity)을 반환한다. 파이썬에서는 각 객..

[C / C++] Call by value(값에 의한 호출), Call by Reference(참조에 의한 호출), 무엇이 다르지? [내부링크]

컴퓨터과학에서 함수와 관련된 부분을 보면 call by value(값에 의한 호출), call by reference(참조에 의한 호출)이라는 개념을 마주칠 때 있다. C / C++ 언어 계열은 포인터라는 엄청난 기능 덕분에 직접 메모리에 접근할 수 있기에 두 가지 방법 모두 사용이 가능하고, 다른 특징을 가진다. C++에서 사용되는 두 가지 방법을 간략하게 알아보도록 하자. 1. Call by Value : 값에 의한 호출 Call by value는 함수 호출 스택에서 매개변수를 저장하는 공간에 인자를 저장하는 방법으로 인자가 함수에게 전달되는 방식이다. 다른 말로, 인자로 넘겨진 값이 변경되어도 그 함수에서만 변경된다는 의미이다. 예제를 살펴보도록 하자. HTML 삽입 미리보기할 수 없는 소스 voi..

[Python] 파이썬에서 'a == b' 와 'a is b'는 무슨 차이가 있지? [내부링크]

파이썬에서 동일한 것을 비교하는 구문은 두 가지가 있다. 등호가 두 개 붙어있는 연산자 '=='와 파이썬 만의 고유 문법인 'is'가 존재한다. 보통 둘은 구분을 하지 않고 사용한다. 그럼, 이 두 연산자는 아무런 차이가 없을까? 다음 코드를 보자. HTML 삽입 미리보기할 수 없는 소스 위의 '=='의 경우 참이 나왔지만, 'is'의 경우 거짓이 나온 것을 확인할 수 있다. 두 연산자에 어떤 차이가 있길래 이런 결과가 나오는 것일까? 이번 포스팅에서 알아보도록 하자. 1. == 과 'is' 먼저, 다른 언어에서도 사용되는 비교 연산자 '=='부터 알아보자. '=='는 값(value)이 동일한지 확인하는 연산자이다. 다른 말로, 만약 동일한 주소값이 아니더라도, 같은 값을 지니고 있다면 True를 반환하..

[Python] assert문에 관한 모든 것 [내부링크]

파이썬뿐만 아니라 여러 언어(C / C++, Java...)에서는, assertion이란 개념을 차용하고 있다. 그리고 이러한 assertion 개념은 사용자의 코드를 시험하거나, 디버깅할 때 매우 유용하게 사용할 수 있는 테크닉 중 하나이다. 이번 포스팅에서는 파이썬에서의 assert문에 관하여 알아보자. 1. assert문이란? assert문 혹은 assertion은 코드 개발 간에 하나의 '검토'를 담당한다. assert문은 일정 조건이 사용자의 의도에 부합하는지 검사하는 역할을 하는 구문이라 생각하면 된다. 예를 들어, int형이 매개변수인 함수에 인자로 str형이 들어오는지 검사할 수 있다. 혹은 return 값이 원하는 형태인지 검사할 수 있다. 따라서, 사용자가 의도한 형태인지 손쉽게 검사할..

[Python] 파이썬의 오류 메시지를 읽는 매우 간단한 방법 [내부링크]

파이썬을 다루는 사람이라면, 다음과 같은 문구를 매우 매우 많이 보았을 것이다. Traceback (most recent call last): File "error.py", line 1, in print(4/0) ZeroDivisionError: division by zero 근데, 이 문구를 자세히 들여다보면 첫 번째 줄에 Traceback부터 시작한다. 이 친구는 무엇을 하는 친구일까? 함께 알아보도록 하자. 1. Traceback이란? Traceback은 파이썬에서 특정 지점에서 함수 호출에 관한 정보를 담고있다고 생각하면 된다. 다른 언어에서는 stack trace, backtrace 등등 여러 용어가 사용되지만, 파이썬에서는 traceback을 사용한다. 만약, 파이썬에서 오류가 발생한다면, t..

[Python] 출력 함수 print()에 관한 모든 것 3 : 조금 더 맛깔나게 출력을 하여보자, pprint [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Python] 출력 함수 print()에 관한 모든 것 1 프로그래밍 언어마다 출력의 방식은 다르지만, 대부분 가독성이 좋게 출력된다. 직접 사용자가 줄 및 공백을 조절하여 출력할 수 있고, 혹은 다른 특별한 함수를 사용할 수 있다. 그러나, 출력에 한하여 파이썬과 다른 언어와의 가장 큰 차이점은, 다른 언어는 정렬을 대부분 문자열 포맷팅 혹은 줄바꿈, 공백으로 한다. 파이썬은 이를 자동으로 해주는 모듈이 있으니, pprint 모듈 되시겠다. 먼저, pprint는 pretty-print의 약자로, 말 그래도 "예쁘게 출력하기", 즉 가독성이 좋게 출력할 수 있게 해주는 모듈이다. 1. pprint..

[Python] 출력 함수 print()에 관한 모든 것 2 : 왜 print는 구문에서 함수로 변화하였는가? [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Python] 출력 함수 print()에 관한 모든 것 1 지난 글에는 print 함수의 간략한 개요 및 매개변수들에 관하여 알아보았다. 이번 포스팅은 print의 함수적인 측면을 조금 더 보려고 한다. 1. print의 변화 파이썬 2.7에서 파이썬 3으로의 업그레이드에서, print의 사용 방식에 변화가 생겼다. 파이썬 2.7.x 버전까지는 print는 하나의 구문으로 사용되었다. HTML 삽입 미리보기할 수 없는 소스 파이썬 3부터는 print는 하나의 함수처럼 다루어졌으며, 우리가 알고 있는 방식으로 print문은 변화하였다. 이러한 함수로의 변화의 이유는 크게 두 가지를 꼽을 수 있다. ..

[Python] 출력 함수 print()에 관한 모든 것 1 : print 함수부터 먼저 이해하자. [내부링크]

Python 초보자들이 먼저 배우고, 정말 많은 곳에서 사용되는 내장 함수를 꼽으라 하면 print를 꼽을 수 있다. print문은 화면에의 출력 그 이상의 기능을 할 수 있는 함수 중 하나이다. 단순 출력밖에 모른다면, 아직 print문의 잠재력을 십분 활용하지 못한다고 할 수 있다. 이번 포스팅에서는 print에 대하여 자세하게 알아보자. 이번 글을 파이썬 3을 기준으로 다룰 예정이니 파이썬 2에서의 print 구문은 다루지 않을 예정이다. 1. print() print() 함수는 파이썬 내장함수 중 하나로 특별히 다른 모듈을 활용하지 않아도 사용할 수 있는 함수이다. 실제로 함수 자체를 호출하면 다음과 같은 결과를 얻을 수 있다. HTML 삽입 미리보기할 수 없는 소스 출력으로 을 얻을 수 있고 즉..

[Python] [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Python] for문의 친구 range에 관한 모든 것 다음 코드를 살펴보자. 과연 이 코드를 실행하는데 얼마나 시간이 걸릴까? (앞의 숫자는 $10^{16}$, 뒤의 숫자는 $10^{16}+1$)이다. HTML 삽입 미리보기할 수 없는 소스 range에 대하여 알고있다면, 이 값을 출력하면 True가 나온다는 것은 자명하다. 근데, 실제로 실행하면 얼마나 걸릴까? range문은 0부터 시작하는거니까 $10^{16}$ 까지면 정말 오래 걸릴거라 생각하기 쉽다. 헐! 직접 실행하여보면, 0.1초도 안되는 시간 안에 실행되는 것을 확인할 수 있다. 생각해보자. 애초에 실행이 되기 전에 메모리가 부족..

[C / C++] return 0; 는 왜 종료의 표준이 되었나? 프로그램 종료에 대한 이해 [내부링크]

C++에서 프로그램을 종료할 때, 어떤 것을 써야 할까? 여러 방법이 있지만, 가장 표준적인 방법은 int main()과 함께 따라오는 return 0; 구문이다. HTML 삽입 미리보기할 수 없는 소스 그러나, 종료하는 방법 중 exit(0)를 활용하는 방법도 있다. 그럼, 다음과 같이 적으면 안되나? 왜 이 방법은 표준이 되지 않았을까? HTML 삽입 미리보기할 수 없는 소스 이번 포스팅에서는 이에 대하여 알아보고, 왜 return 0;가 표준이 되었는지 살펴보자. 1. return 0 의 뜻 C / C++에서 프로그램을 종료할 때, 무의식적으로 쓰는 구문은 main함수의 끝에 붙어있는 'return 0;' 이다. 이에 대한 뜻은, 프로그램을 끝내고 난 뒤 정수 '0'을 반환한다는 뜻이다. 근데, 이..

[Python] 드디어 파이썬에서도 switch-case문이? match-case문에 대하여 알아보자! [내부링크]

파이썬이 최근에 정식으로 3.10 업데이트를 하면서, 새로운 제어문의 꼴이 생겼다. match문이 이번 포스팅의 주인공이다. 파이썬은 여러 조건 분기를 if...elif...else를 통해 처리하였지만, 3.10을 통해 구조적 패턴 매칭(Structural Pattern Matching)을 새로 도입하였다. C / C++나 자바나 자바스크립트를 공부했던 사람들은 switch문, 혹은 Rust의 경우 패턴 매칭이 익숙할 것이다. 이와 유사하게, 파이썬에는 match-case문이 새로 등장하였다. 이번 포스팅에서 match-case문에 대하여 한번 알아보도록 하자. 1. match match-case문은 match 입력에 대하여 일치하는 패턴가 있다면 해당 case문에 속한 코드를 실행한다. 만약 해당되는 ..

[Python] else문에 관한 깊은 고찰 (if-else vs. for-else / while-else를 중심으로) [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Python] if-else 뿐만 아니라 for-else / while-else도 가능하다고? 본 글은 CPython core developr인 Nick Coghlan의 글 http://python-notes.curiousefficiency.org/en/latest/python_concepts/break_else.html)을 바탕으로 작성되었습니다! 파이썬에는 else문과 관련하여 재밌는 사실들도 많고, 파이썬 만의 독창적인 문법을 가지는 경우도 많다. 그러나, for-else / while-else문을 소개하는 글에서 이야기했듯이, else문은 많은 프로그래머들을 혼란에 빠뜨리기 충분하다..

[Python] if-else 뿐만 아니라 for-else / while-else도 가능하다고? [내부링크]

파이썬에서는 다른 언어에서는 찾아볼 수 없는 독특한 문법을 가능한 경우가 많은데, 이번 글에 소개할 반복문 제어인 for-else문 / while-else문도 그 한 가지이다. 바로 본론으로 들어가보자. 1. for - else 일반적으로 for문을 활용하면 break, continue, pass과 같은 제어문 문법을 활용한다. 여기에 else문을 추가할 수 있다는 것을 아는가? 모르는 사람들이 대다수일 것이다. 다음과 같은 코드가 작성되어 있다고 작성하자. 이 코드는 2부터 9까지 각 수가 소수인지 아닌지 판단하는 간단한 코드이다. 만약 소수일 경우 'num is a prime number'가 출력되고, 아닐 경우 그 수를 두 수의 곱으로 출력하는 코드이다. HTML 삽입 미리보기할 수 없는 소스 그러..

[Python] for문의 친구 range에 관한 모든 것 [내부링크]

python에는 for문과 짝지어서 자주 나타나는 구문이 있으니, range이다. 그러나, range가 에 대한 정확한 내용을 아는 것과 모르는 것은 큰 차이를 보인다고 생각한다. 이번 포스팅을 통해 range에 대하여 알아보자. 1. range range는 파이썬의 기본 class의 한 종류이다. 흔히 for문과 같이 따라다녀 함수나 하나의 자료형으로 착각하는 python 이용자들이 많은데, python3 이후부터 range는 엄연한 CLASS이다. 다만, python2에서 range에 대응되는 xrange는 함수이다. 정확히 말하면, 시퀀스 형의 한 종류인 클래스라 할 수 있다. (다른 말로, list, tuple과 결이 비슷하다.) 흔히 "~부터 ~까지"의 정수를 하나씩 사용하는 데 자주 사용되며,..

[Python] 정렬 메서드 sort()에 관한 모든 것 [내부링크]

파이썬에는 sort()라는 list 자료형 메서드가 존재한다. (sorted 함수는 다른 포스팅으로 다루겠다) 자주 사용하지만, 제대로 정리할 필요는 있을 거 같아 이 포스팅으로 정리한다. 1. sort() sort() 메서드는 list 자료형의 메서드중 하나로, list를 제자리에서 정렬을 하는 역할을 한다. 원래의 list를 수정하므로 파괴적 메서드이다. 다른 말로, sorting이 가능한 자료형이 list안에 담겨있고, 각 자료형 간 비교가 가능하다면 (쉽게 말해, '

[C++] for문과는 조금 다른 활용? for_each 함수를 활용하여보자. [내부링크]

C++에서 반복문의 대명사 for문으로 배열이나 container에 순차적으로 접근할 수 있다. HTML 삽입 미리보기할 수 없는 소스 다만, 각 원소에 대한 작업을 쉽게 해 줄 수 있는 STL 함수가 있으니, std::for_each로 한 번에 처리하여보자. 1. for_each (※ https://www.cplusplus.com/reference/algorithm/for_each/에서 함수에 대한 정보를 확인할 수 있다.) C++의 알고리즘 관련 헤더 에는 for_each라는 함수는 다음과 같은 구조를 가진다. Function for_each(InputIterator first, InputIterator last, Function fn) for_each는 3개의 인자를 받는다. InputIterato..

[C++] INF의 값은 어떤 것으로 해주는 것이 좋을까? [내부링크]

다익스트라 알고리즘이나 여러 최단 거리 알고리즘에서, 초기 거리를 매우 큰 값(INF)으로 초기화해야 할 때가 왕왕 있다. 근데, 어떤 특정 값을 넣어야 할 지에 대해서는 아직 정해진 것이 없다. 사용자 취향에 따라 다음과 같이 정할 수 있다. HTML 삽입 미리보기할 수 없는 소스 그럼, 어떤 것을 사용해야 가장 부작용이 적을까? 한번 알아보도록 하자. 1. INF = INT_MAX 간혹 매우 큰 값으로 int형이 가질 수 있는 가장 큰 값인 $2^{32}-1$을 사용하는 경우가 있다. 이 수를 사용할 때 C / C++의 헤더 혹은 에 매크로로 정의되어 있는 INT_MAX를 활용하면 아주 쉽게 정의할 수 있다. (INT_MAX의 실제 값은 컴파일러 종류에 따라 다르지만, int형이 가질 수 있는 가장 ..

[C++] 회문(팰린드롬) 판별에 관한 모든 것 [내부링크]

이번 글의 주제는 '팰린드롬 판별'에 관한 이야기이다. 쉬운 주제이지만, 팰린드롬 판별을 구현할 수 있는 방법은 여러 가지이니 이에 대하여 작성해보려 한다. 1. 팰린드롬이란? 팰린드롬(Palindrome, 회문)은 처음부터 끝까지 거꾸로 읽어도 똑같이 읽히는 수 또는 문자열을 의미한다. 예를 들면, "racecar"나 "abcdcba", 한글로 하면 "수박이박수", "다시합창합시다" 정도가 되겠다. 이 팰린드롬을 판별하는 것은 여러 방법이 있지만, 먼저 가장 팰린드롬의 기본에 충실하게 코드를 작성하여 보자. 2. 팰린드롬 판별 1 - Naive 팰린드롬을 판별하려면, 처음 글자부터 마지막 글자까지 거꾸로 셌을 때 같은 수거나 문자열이면 가능하다. 입력이 문자열일 경우 다음과 같이 함수를 작성할 수 있다..

[C++] 두 배열을 함수 한 방에 아주 쉽게 비교하자! equal [내부링크]

코드를 작성하다 보면, 두 배열을 비교해야 하는 순간이 찾아온다. 두 배열의 원소가 같은 값인지, 아니면 다른 값인지 하여서 하나씩 비교해야 할 때, 우리는 다음과 같이 작성한다. vector 형인 두 배열 vec, vec2를 비교한다고 하고, 두 배열의 길이는 같다고 가정하자. HTML 삽입 미리보기할 수 없는 소스 이런! 단순 비교인데 코드를 7줄이니 먹는다는게 불편하다. 이를 한 번에 해결할 수 있는 함수 equal을 소개하도록 하겠다. 1. equal (※ https://www.cplusplus.com/reference/algorithm/equal/ 에서 함수에 대한 정보를 확인할 수 있다.) C++의 알고리즘 관련 여러 함수들이 담긴 헤더 에서의 equal 함수는 다음과 같은 두 가지 구조를 가..

[C++] 배열 안을 함수 한 번에 회전시켜보자! rotate [내부링크]

종종 비트마스킹을 활용한 다이나믹 프로그래밍이나 요세푸스 문제, BFS 등등 배열을 반시계 방향으로 $k$번 회전시켜야 할 경우, 다음과 같은 방법을 활용하였다. 다음 코드는 vector vec를 $k = 1$만큼 회전시킨다고 할 때, C++의 함수 swap를 활용하면 다음과 같이 작성할 수 있다. HTML 삽입 미리보기할 수 없는 소스 만약, $k > 1$이라면 새로운 container를 만들어, 나머지 연산을 활용하여 회전 이후 해당하는 위치에 새로 데이터를 담을 수 있다. 그러나, 이 경우 불필요하게 배열의 크기만큼 새로운 공간을 할당해야 하여 불편하다. HTML 삽입 미리보기할 수 없는 소스 이 경우 한 줄의 코드로 위의 작업을 한 번에 할 수 있는 함수가 있으니, rotate 되시겠다. 1. r..

[Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (5) [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (4) 자, 대략적인 시간 복잡도 간 속도를 알았으니, 구체적으로 시간 복잡도를 어떻게 활용할 수 있는지 생각하여보자. 시간 복잡도는 말 그대로 "대략적인 시간"에 관한 이야기이다. 다른 말로, 대충 최대 어느 정도의 시간 및 연산 횟수가 소요될 지 어림잡을 수 있다는 이야기이다. 실제 코딩 테스트나 각종 대회에서도 필요한것은 소요되는 시간이지 시간 복잡도 그 자체가 아니다. 코딩계에서 통용되는 하나의 관습이 있다. 1초당 연산 횟수는 대략 1억($10^9$)번이다. 구체적으로 말하자면 시간 제한이 1초라면 대략 1억번 연산..

[C++] 여러 값 중 max, min을 찾을 때 아직도 이렇게 쓰시나요? [내부링크]

C++에서 많은 사람들이 최솟값, 최댓값을 찾을 때 min, max를 쓸때 다음과 같이 쓰는 모습을 너무나도 많이 봤다. HTML 삽입 미리보기할 수 없는 소스 위에 코드같이 세 개의 값에 대해서만 min, max를 구한다면 그래도 불편을 감수하고 사용할 수 있다. 그런데, 만약 4개, 5개 등등... 굉장히 많은 수들의 최댓값, 최솟값을 비교해야 한다면? 값들이 배열이나 container안에 있으면 함수(max_element / min_element)를 통해 구할 수 있지만, 만약 각각의 값들이 다른 공간안에 담겨있다면 조금 곤란할 수 있다. C++ 11부터는 다음과 같이 min과 max를 구할 수 있다. 네 개의 값 a, b, c, d의 값 중 최솟값과 최댓값을 찾는다고 하면 코드를 이렇게 작성할 수..

[C++] 누적 합을 함수 한 방에 구하여보자! partial_sum [내부링크]

종종 누적 합(partial_sum) 알고리즘을 사용하기 위하여 각 부분별 부분 합을 구할 때가 많다. 그럴 때 우리는 이런식으로 코드를 작성하였다. vector nums의 처음부터 끝까지 각 부분별 누적합을 구하고, 이를 vector acc_nums에 담는다고 가정하자. HTML 삽입 미리보기할 수 없는 소스 위와 같은 코드를 단 두 줄의 코드로 압축할 수 있으면 믿을 것인가? 누적 합을 쉽게 위하여 C++에는 partial_sum이라는 함수가 정의되어 있다. 1. partial_sum (※ https://www.cplusplus.com/reference/numeric/partial_sum/ 에서 함수에 대한 정보를 확인할 수 있다.) C의 Sequence 관련 여러 함수들이 담긴 헤더 에서의 part..

[Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (4) [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간 복잡도 (3) 가장 "작은" 함수들끼리의 증가 속도를 비교하여 보자. 통상 사용되는 "작은" 함수들의 개형을 나타내면, 아래 차트와 같은 결과를 얻을 수 있다. "작은" 함수들 ($1,\,n,\,\log n,\,n\log n,\,n^2,\,2^n,\,n!$)을 비교하였을 때 증가속도의 크기는 다음과 같이 쓸 수 있다. $$\large O(1) < O(\log n) < O(n) < O(n\log n) < O(n^2) < O(2^n) < O(n!) < \cdots$$ 따라서, 만약 여러 알고리즘이 중첩된다면 더 오른쪽에 있는 알고리즘..

[Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (3) [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (2) $$ \huge Thinking \quad about \quad Big-O$$ 저번 글에서 빅-오 표기법을 "작은" 함수들로 나타내는 법을 다루었었다. 자주 사용하는 "작은" 함수들을 통해 시간 복잡도를 나타내었고, 이를 수식적으로 증명하였다. 실생활에서는 하나의 알고리즘이 아닌, 여러 알고리즘이 복합적으로 쓰이는 경우가 많다. 정렬을 하고 원하는 숫자를 찾는다던가, 누적 합을 여러 번 구해 가장 큰 합을 찾는 경우 등등 여러 알고리즘이 쓰이는 경우 어떻게 시간 복잡도를 산출해야 할까? 모든 알고리즘을 수식적으로 나타..

[Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (2) [내부링크]

[※ 주의 ※] 아래를 이해하지 않고 이 글을 볼 경우, 이해가 되지 않는 부분이 있을 수 있습니다. 1. [Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (1) 지난 글에 $x > k$에서 $\left| f(x)\right| \leq C\left|g(x)\right|$를 만족하는 상수 $k, C$가 존재하면 $f(x) = O(g(x))$라고 표현할 수 있었다고 하였다. (엄밀히 말하면 $f(x) \in O(g(x)))$이라 표현해야 한다. $O(g(x))$는 하나의 집합이기 때문이다.) 그럼, 이런 질문을 하여보자. $7x^2$은 $O(n^3)$인가? 생각해보면 $x > 7$ 일 때 $7x^2 < x^3$이므로 (부등식의 양변에 $x^2$를 곱하자.) $C = 1, k = 7..

[Algorithm] 어떤 알고리즘이 더 빠르고 효율적인가? - 시간복잡도 (1) [내부링크]

1. 서론 알고리즘의 정의를 뜯어보자면, "어떤 문제의 해결을 위하여, 입력된 자료를 토대로 원하는 출력을 유도하여 내는 규칙의 집합"을 의미한다. 결국, 하나의 문제를 해결하는 규칙 / 방법이라고 요약할 수 있겠다. 컴퓨터가 인류의 역사에 나타나면서 인류는 컴퓨터의 도움으로 해결할 수 있는 일련의 규칙 혹은 방법을 체계화하였다. 컴퓨터 시대의 태동 속에서, 누구의 규칙이나 방법이 다른 규칙 / 방법에 비해 더 좋은 방법을 가지는지에 대한 궁금증은 하나의 중요한 주제로 떠올랐다. 스스로 생각해보자, 외부 요인이 같다는 가정 하에 어떤 알고리즘이 다른 알고리즘보다 뛰어나다는 것은 무엇을 의미할까? 예를 들어, 1부터 (1억 + 1) 까지의 홀수들의 합을 구하는 알고리즘을 떠올려보자. ( $ 1+3+5+\c..

[C++] 최댓값과 최솟값을 한 번에 찾자 max_element / min_element [내부링크]

어떤 배열이나 container의 최댓값 및 최솟값이 필요한 경우는 무수히 많다고 해도 과언이 아니다. 하지만, 배열의 원소 하나씩 접근하고 비교하면서 최댓값 / 최솟값을 찾으면 이거만큼 코드의 가독성이 떨어지고 슬픈일이 아닐 수 없다. 특별한 함수를 사용하지 않고 for문을 통해 배열의 원소 하나씩 접근하며 도는 경우 다음과 같은 코드를 작성할 수 있다. HTML 삽입 미리보기할 수 없는 소스 배열 nums의 원소를 하나씩 돌면서 max_num과 min_num에 각각 최댓값과 최솟값이 담기는 모습을 확인할 수 있다. 그러나, 너무나도 귀찮고, 귀찮다. 하물며 최댓값 또는 최솟값의 index를 묻는다면 새로운 변수에 담아야 하거나, 다른 방법으로 구해야 한다. 이제, 이러한 길고 긴 for문을 탈출하고 ..

[C++] 아직도 sum += arr[i] 쓰시나요? accumulate으로 해결하세요! [내부링크]

accumulate 함수는 많은 C++ 사용자들에게 널리 알려져 있지만, 그래도 아직 모르는 사용자들이 있다고 생각되어 포스팅을 남긴다. std::accumulate 함수는 특정 배열 혹은 container의 누적 합을 구할 때 사용가능한 함수이다. 특히, 전체 합을 구하거나, 한 번의 누적 합을 구할 때 사용할 수 있다. 함수 accumulate를 사용하지 않고 누적 합을 구한다면 다음과 같이 작성할 수 있다. 예를 들어, vector nums 안에 있는 모든 원소들의 합을 구한다고 가정하여보자. 다음과 같이 코드를 작성할 수 있다. HTML 삽입 미리보기할 수 없는 소스 코드 자체는 길지 않지만, accumulate는 누적 합을 구하는 것 이외의 응용을 할 수 있는 방법이 무궁무진하다. 1. accu..

[C++] 모두 만족하지 않는 지 한번에 검사하는 함수 none_of [내부링크]

이 함수는 앞서 소개한 all_of 나 any_of 과 비슷한 성격을 띠고 있는 함수지만, 앞의 두 함수보다 더 자주 사용하고 유용하게 사용할 수 있는 함수를 하나 소개하고자 한다. 만약, 다음과 같은 문제가 있다고 하여보자. 어떤 container 안에 모든 원소가 -1이 아닌지 확인하시오. none_of를 알기 전, 필자는 이러한 코드를 작성하였을 것이다. HTML 삽입 미리보기할 수 없는 소스 이런이런! 7줄이나 먹는 코드라니, 매우 비효율적인 코드이다. 이를 none_of 함수를 사용하여 한 줄로 압축하여보자! 1. none_of (※ https://www.cplusplus.com/reference/algorithm/none_of/ 에서 함수에 대한 정보를 확인할 수 있다.) C++의 알고리즘 관..

[C++] 배열 안을 한꺼번에 검사하는 손쉬운 방법 all_of [내부링크]

어떤 배열 안 혹은 container 안에서 모든 원소들이 어떤 특정 조건을 만족하는지 검사하기 위하여 우리는 for문을 활용하여, 하나씩 검사하는 방법을 사용하였다. 예를 들어, vector num 이라는 container 안에 모든 원소가 모두 0보다 큰지 검사하기 위해 다음과 같은 코드를 작성하였다. HTML 삽입 미리보기할 수 없는 소스 또 이런! 이러한 코드를 작성하는데 7줄을 써야한다고? 시간 낭비에 공간 낭비 따윈 걱정 마시라, 이제는 함수 all_of 를 사용하면 단 한줄만에 작성할 수 있다! 1. all_of (※https://www.cplusplus.com/reference/algorithm/all_of/ 에서 함수에 대한 정보를 확인할 수 있다.) C++의 알고리즘 관련이 담긴 헤더 ..

[C++] 배열 안 원소가 있는지 한번에 확인하는 함수 any_of [내부링크]

어떤 배열 안에 어떤 특정 조건을 만족하는 원소가 있는지 검사하기 위해 우리는 배열 안의 모든 원소를 둘러보며, 하나씩 비교하는 방법을 사용하였다. 예를 들어, 배열 arr 안에 정수 0이 있는지 for문을 활용하여 작성하면 다음과 같이 작성할 수 있다. HTML 삽입 미리보기할 수 없는 소스 이런! 코드의 길이가 7줄이나 된다고? 너무나도 귀찮고 귀찮다. 이를 위하여 C++ 에는 함수 any_of 가 만들어져 있다! 1. any_of (※ https://www.cplusplus.com/reference/algorithm/any_of/ 에서 함수에 대한 정보를 확인할 수 있다.) C++의 알고리즘 관련이 담긴 헤더 에서의 any_of 함수는 다음과 같은 구조를 가진다. bool any_of (InputI..

[C++] for문을 Python의 for문처럼 다루어보자. range-based for [내부링크]

필자는 코딩을 Python 3 로 시작하였고, 따라서 아직 C++ 문법보다 Python 3 의 문법에 조금 더 익숙하다. 따라서, C++ 11부터 지원되는 range-based for문을 자주 사용한다. Python을 다루어보지 않은 C++ 사용자들도 알아두면 좋은 문법이니 소개하도록 한다. 또한, 매번 배열의 길이를 넣어주느라 피곤한 프로그래머들은 다른 형태의 for문을 알아두는 것이 좋다고 생각한다. 1. range-based for loop Range-based for loop문은 다음과 같은 꼴을 가진다. HTML 삽입 미리보기할 수 없는 소스 Python을 다루었던 기억이 있는 프로그래머들은 위와 같은 코드가 익숙하지만, 다루지 않았던 프로그래머들은 위와 같은 코드가 조금 어색할 수 있다. C+..

[C++] 더이상 arr[i] = i는 그만! 고수들은 쓰는 함수 iota [내부링크]

Union-Find / 분리집합 알고리즘이나 여러 문제를 풀 때 종종 자기 자신의 index를 값으로 초기화 해야하는 경우가 많다. 우린 그럴때마다 for문을 이용한 방법으로 다음과 같은 코드를 사용한다. HTML 삽입 미리보기할 수 없는 소스 이를 한 방에 처리해주는 함수가 있으니, 이름하여 iota 되시겠다! 1. iota (※ https://www.cplusplus.com/reference/numeric/iota/ 에서 함수에 대한 정보를 확인할 수 있다.) C의 Sequence관련 여러 함수들이 담긴 헤더 에서의 iota 함수는 다음과 같은 구조를 가진다. void iota (ForwardIterator first, ForwardIterator last, T val) iota는 3개의 인자를 받는..

[BOJ] 10871번 - X보다 작은 수 [내부링크]

https://www.acmicpc.net/problem/10871 10871번: X보다 작은 수 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다. www.acmicpc.net 문제 정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다. 출력 X보다 작은 수를 입력받은 순서대로 공백으..

[BOJ] 10869번 - 사칙연산 [내부링크]

https://www.acmicpc.net/problem/10869 10869번: 사칙연산 두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 입력 두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000) 출력 첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다. 제한 시간 제한 : 1초 / 메모리 제한 : 256MB 1. 어떻게 풀까? 1-1) C언어 계열에서의 연산자를 아는가? 문제에서 요구한 ..

[BOJ] 10818번 - 최소, 최대 [내부링크]

https://www.acmicpc.net/problem/10818 10818번: 최소, 최대 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다. www.acmicpc.net 문제 N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다. 출력 첫째 줄에 주어진 정수 N개의 최솟값과 최..

[C++] <bits/stdc++.h> 헤더 쓸 때 시간 두 배 이상 줄이는 꿀팁!!!! [내부링크]

2022.04.05 - [PS 갤러리/Tips & Tricks] - [C++] C++의 무적 헤더 는 무엇인가? [C++] C++의 무적 헤더 는 무엇인가? 여러 경쟁적 프로그래밍 대회나 답변들을 보면 가 자주 쓰이는 것을 볼 수 있다. 또한, 나는 주렁주렁 여러 헤더를 달 동안, 옆의 사람은 간단히 하나의 헤더로 끝내는 것을 보면 괜히 부럽기도 0xffffffff.tistory.com 위 글에서 의 단점으로 "느리다"를 꼽았다. 하지만, Pre-compiled 헤더를 사용하면 시간을 단축시킬 수 있다고 하였다. Pre-compiled 헤더를 직접 프로젝트 안에 쓰자. 특히, 알고리즘 문제 해결을 하는 사람들에게는 아주 좋은 꿀팁이라 생각한다. g++를 사용하는 사용자를 기준으로 작성되었다. 1. 헤더 ..

[C++] C++의 무적 헤더 <bits/stdc++.h> 는 무엇인가? [내부링크]

여러 경쟁적 프로그래밍 대회나 답변들을 보면 가 자주 쓰이는 것을 볼 수 있다. 또한, 나는 주렁주렁 여러 헤더를 달 동안, 옆의 사람은 간단히 하나의 헤더로 끝내는 것을 보면 괜히 부럽기도 한다. 대관절 는 무엇을 하는 헤더인가? 1. bits/stdc++.h을 써야 하는 이유 한 마디로 말하면 다음과 같이 말할 수 있다. C++ 문제해결을 여행하는 여행자들을 위한 종합 선물 세트 말 그대로 C++ 알고리즘 관련 코드에서 필요한 자료형들을 모~~~~두 담고 있다고 해도 무관하다. 실제, GCC 4.8.0의 는 다음과 같이 헤더를 담고 있다. 이로 인하여, C++또는 C언어에서 #include , #include , #include ... 과 같이 필요한 자료형 혹은 함수 헤더 노가다를 하지 않아도 된다..

[C++] 초기화 함수 fill 과 memset은 무엇이 다를까? [내부링크]

코딩을 하거나 문제를 풀다 보면 우린 배열을 선언하고, 그 안의 초깃값들을 채워 넣어야 할 일들이 많다. 그럴 때, 다음과 같이 for 반복문을 이용하여 아래와 같은 방법으로 배열 초기화를 한다. HTML 삽입 미리보기할 수 없는 소스 그러나, 초기화를 매번 해야 하거나, 배열이 2차원, 3차원이 되면 코드가 불필요하게 길어지거나 가독성이 떨어질 수 있다. 이를 방지하기 위하여, C언어 & C++에서는 두 가지 종류의 배열 초기화 함수를 제공한다. N개의 칸을 차지하는 배열 arr의 값을 0으로 초기화한다고 하면 다음 두 가지 방법으로 채울 수 있다. memset(arr, 0, sizeof(arr)) fill(arr, arr+N, 0) 1. memset (※ https://www.cplusplus.com..

[BOJ] 10809번 - 알파벳 찾기 [내부링크]

https://www.acmicpc.net/problem/10809 10809번: 알파벳 찾기 각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출 www.acmicpc.net 문제 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다. 출력 각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 ..

[BOJ] 9498번 - 시험 성적 [내부링크]

https://www.acmicpc.net/problem/9498 9498번: 시험 성적 시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다. 출력 시험 성적을 출력한다. 제한 시간 제한 : 1초 / 메모리 제한 : 128MB 1. 어떻게 풀까? 1-1) 구현에 초점을 맞추자. 어려울 것..

[BOJ] 8958번 - OX퀴즈 [내부링크]

https://www.acmicpc.net/problem/8958 8958번: OX퀴즈 "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수 www.acmicpc.net 문제 "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다. "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작..

[BOJ] 3052번 - 나머지 [내부링크]

https://www.acmicpc.net/problem/3052 3052번: 나머지 각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다. www.acmicpc.net 문제 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오. 입력 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다. 출력 첫째 줄에, 42로 나누었을 때, 서로 ..

[BOJ] 2920번 - 음계 [내부링크]

https://www.acmicpc.net/problem/2920 2920번: 음계 다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8 www.acmicpc.net 문제 다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다. 연주한 순서가 주어졌을 때..

[BOJ] 2908번 - 상수 [내부링크]

https://www.acmicpc.net/problem/2908 2908번: 상수 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 www.acmicpc.net 문제 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다. 상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상..

[BOJ] 2884번 - 알람 시계 [내부링크]

https://www.acmicpc.net/problem/2884 2884번: 알람 시계 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만, www.acmicpc.net 문제 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다. 이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다. 바로 "45분 일찍 알람 설정하기"이다. 이 방법은 단순하다. 원래 설정되어 있..

[BOJ] 2753번 - 윤년 [내부링크]

https://www.acmicpc.net/problem/2753 2753번: 윤년 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서 www.acmicpc.net 문제 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다. 예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다. 입력 ..

[BOJ] 2742번 - 기찍 N [내부링크]

https://www.acmicpc.net/problem/2742 2742번: 기찍 N 자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다. 출력 첫째 줄부터 N번째 줄 까지 차례대로 출력한다. 제한 시간 제한 : 1초 / 메모리 제한 : 128MB 1. 어떻게 풀까? 1-1) 'N 찍기' 와 반대로 하면 된다. 말 그대로 'N 찍기'와 반대로 하면 된다. for문의 순서를 i = N부터 i = 1까지 출력해주면 되는 문제. 쉽게 할 수 있다. for문을 활용하여보자. 2) 최종..

[BOJ] 2741번 - N 찍기 [내부링크]

https://www.acmicpc.net/problem/2741 2741번: N 찍기 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다. 출력 첫째 줄부터 N번째 줄 까지 차례대로 출력한다. 제한 시간 제한 : 1초 / 메모리 제한 : 128MB 1. 어떻게 풀까? 1-1) for문을 활용한 기본문제 별도의 설명이 필요없는 for문을 이용한 문제. 2) 최종 코드 HTML 삽입 미리보기할 수 없는 소스

[BOJ] 2739번 - 구구단 [내부링크]

https://www.acmicpc.net/problem/2739 2739번: 구구단 N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다. www.acmicpc.net 문제 N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다. 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다. 출력 출력형식과 같게 N*1부터 N*9까지 출력한다. 제한 시간 제한 : 1초 / 메모리 제한 : 128MB 1. 어떻게 풀까? 1-1) 구구단을 외자. 어느 경로로 프로그래밍을 배우든, 구구단을 출력하는 문제는 연습문제로 맞닥뜨리게 된다. N을 입력 받은 후, i를 1부터 9까지 N과 곱해주고 이를 출력하..

[BOJ] 2675번 - 문자열 반복 [내부링크]

https://www.acmicpc.net/problem/2675 2675번: 문자열 반복 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다 www.acmicpc.net 문제 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다. QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\..

[BOJ] 2577번 - 숫자의 개수 [내부링크]

https://www.acmicpc.net/problem/2577 2577번: 숫자의 개수 첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다. www.acmicpc.net 문제 세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오. 예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다. 입력 첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어..

[BOJ] 2562번 - 최댓값 [내부링크]

https://www.acmicpc.net/problem/2562 2562번: 최댓값 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어 www.acmicpc.net 문제 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다. 입력 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. ..

[BOJ] 2557번 - Hello World [내부링크]

https://www.acmicpc.net/problem/2557 2557번: Hello World Hello World!를 출력하시오. www.acmicpc.net 문제 Hello World!를 출력하시오. 입력 없음 출력 Hello World!를 출력하시오. 제한 시간 제한 : 1초 / 메모리 제한 : 128MB 1. 어떻게 풀까? 1-1) 기본적인 문제 가장 쉬운 문제가 아닐까? 특별한 입력은 없고, 문자열 "Hello World!"를 출력하면 되는 문제이다. 2) 최종 코드 HTML 삽입 미리보기할 수 없는 소스

[BOJ] 2475번 - 검증수 [내부링크]

https://www.acmicpc.net/problem/2475 2475번: 검증수 컴퓨터를 제조하는 회사인 KOI 전자에서는 제조하는 컴퓨터마다 6자리의 고유번호를 매긴다. 고유번호의 처음 5자리에는 00000부터 99999까지의 수 중 하나가 주어지며 6번째 자리에는 검증수가 들 www.acmicpc.net 문제 컴퓨터를 제조하는 회사인 KOI 전자에서는 제조하는 컴퓨터마다 6자리의 고유번호를 매긴다. 고유번호의 처음 5자리에는 00000부터 99999까지의 수 중 하나가 주어지며 6번째 자리에는 검증수가 들어간다. 검증수는 고유번호의 처음 5자리에 들어가는 5개의 숫자를 각각 제곱한 수의 합을 10으로 나눈 나머지이다. 예를 들어 고유번호의 처음 5자리의 숫자들이 04256이면, 각 숫자를 제곱한..

[BOJ] 2439번 - 별 찍기-2 [내부링크]

https://www.acmicpc.net/problem/ 문제 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오. 입력 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. 출력 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다. 제한 시간 제한 : 1초 / 메모리 제한 : 128MB 1. 어떻게 풀까? 1-1) 별 찍기 = 구현 99% 별 찍기 - 1과 마찬가지로, 구현에 초점을 둔다면 쉽게 해결할 수 있다. 따로 설명할 것은 없고, 규칙을 찾아 두 개의 for문을 통해 각 줄에 알맞은 문자를 출력하면 된다. 여기서 각 줄의 공백의 개수는 N - (별의 개수) 라고 할 수 있다. 2) 최종 코드 HTML 삽입 ..

[BOJ] 2438번 - 별 찍기 - 1 [내부링크]

https://www.acmicpc.net/problem/2438 2438번: 별 찍기 - 1 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 www.acmicpc.net 문제 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 입력 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. 출력 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다. 1. 어떻게 풀까? 1-1) 별 찍기 = 구현 99% 별 찍기 시리즈 중 가장 쉬운 문제이다. N을 입력 받은 이후 두 개의 for문으로 출력을 하면 맞았습니다! 를 받을 수 있는 문제. 이후 여러 별 찍기 문제의 기초가 되므로 모르겠으면 천천히 어떻게 구현을 할 지 생각해보자. 2) 최종 코드 HTML ..

[BOJ] 1546번 - 평균 [내부링크]

https://www.acmicpc.net/problem/1546 1546번: 평균 첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보 www.acmicpc.net 문제 세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다. 예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다. 세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을..

[BOJ] 1330번 - 두 수 비교하기 [내부링크]

https://www.acmicpc.net/problem/1330 1330번: 두 수 비교하기 두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오. www.acmicpc.net 문제 두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. A와 B는 공백 한 칸으로 구분되어져 있다. 출력 첫째 줄에 다음 세 가지 중 하나를 출력한다. A가 B보다 큰 경우에는 '>'를 출력한다. A가 B보다 작은 경우에는 '

[BOJ] 1157번 - 단어 공부 [내부링크]

https://www.acmicpc.net/problem/1157 1157번: 단어 공부 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다. www.acmicpc.net 문제 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다. 입력 첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다. 출력 첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다...

[BOJ] 1152번 - 단어의 개수 [내부링크]

https://www.acmicpc.net/problem/1152 1152번: 단어의 개수 첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열 www.acmicpc.net 문제 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다. 입력 첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다...

[BOJ] 1008번 - A/B [내부링크]

https://www.acmicpc.net/problem/1008 1008번: A/B 두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10) 출력 첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다. 1. 어떻게 풀까? 1-1) 간단한 나눗셈 문제이네요. 하지만... C++이 처음이거나 익숙하지 않다면, 나눗셈 연산의 오차를 신경 쓰지 않는 경우가 대다수이다. 사실, 0과 1로만 이루어진 이진법의 세계에서는 실수의 나눗셈을 다룬다는 것이 위험하지만, 이번 문..

[BOJ] 1002번 - 터렛 [내부링크]

https://www.acmicpc.net/problem/1002 1002번: 터렛 각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다. www.acmicpc.net 문제 조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다. 다음은 조규현과 백승환의 사진이다. 이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다. 조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r..

[BOJ] 1001번 - A-B [내부링크]

https://www.acmicpc.net/problem/1001 1001번: A-B 두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10) 출력 첫째 줄에 A-B를 출력한다. --------------------------------------------------------------------------------------------------------------------- 1. 어떻게 풀까? 1-1) 1000번이랑 같은 방법으로 하면 되네요. 1000번과 같은 방법으로 하면 된다. 만약 모르겠으면..

[BOJ] 1000번 - A+B [내부링크]

https://www.acmicpc.net/problem/1000 1000번: A+B 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10) 출력 첫째 줄에 A+B를 출력한다. --------------------------------------------------------------------------------------------------------------------- 1. 어떻게 풀까? 1-1) 음... 간단하네요! 백준 온라인 저지(BOJ)의 가장 첫 문제이자, 가장 기초적인 문제이다. 먼..

Hello World! [내부링크]

2022.03.29 블로그 오픈 첫글 기념

[CSAPP] 1. Data lab (Bit Manipulation) [내부링크]

미국에 악명 높은 시스템 프로그래밍 관련 실험이 있다. CS:APP(Computer Science:A Programmer's Perspective)라고, 미국 카네기 멜론 대학(CMU) 랩(과제) 시리즈라고 한다. 각 과제마다 매우 성격이 다르지만, 나중에 프로그래밍으로 밥 벌어먹고살아야 하는 사람이라면 한 번은 거치고 가야 한다는 말이 있을 정도로 전 세계적으로 인기가 많고, 또 그만큼 유명세도 높은 랩이다. 나의 전공수업 '마이크로프로세서'(라 하고 시스템프로그래밍 가르치는 수업)에서 이 시리즈의 과제를 진행하는데, 과제 제출 이후 CSAPP 시리즈를 연재하면서 이에 대한 복기 차원에서 포스팅을 진행할 예정이다. 첫 번째 CSAPP의 과제는 Data lab으로, 제한된 횟수의 제한된 비트 연산을 통해..