오늘 풀어볼 문제는 코딩 테스트 고득점 Kit에 들어있는 DFS/BFS - 네트워크입니다. 개인적으로는 이 문제는 여행경로와는 다르게 레벨 3치고는 엄청 쉬운 편(?) 인 것 같습니다. programmers.co.kr/learn/courses/30/lessons/43162 코딩테스트 연습 - 네트워크 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있 programmers.co.kr 접근 방식: 1. 주어진 2차원 배열을 갖고 그래프를 만듭니다. 2. 탐색을 해야 하므로 BFS함수를 작성합니다. 모든 탐색이 끝난 후 그래프에서 방문한 노드를 삭제해 줍니다. 한 번의 ..
인터넷: TCP/IP 프로토콜을 사용하여 정보를 주고받는 컴퓨터 통신망 인터넷 구성요소 호스트: 네트워크에 연결된 컴퓨팅 장치 (컴퓨터,서버등등..) 통신 링크: fiber, radio, satellite 등 노드 사이의 패킷을 전달하기 위한 통신 경로 패킷 스위치: 라우터, 링크 계층 스위치 라우터 - 패킷 위치를 추출하여, 그 위치에 대한 최적의 경로를 찾아 패킷을 다음 장치로 전달하는 장치, 여기서 최적의 경로란 일반적으로는 가장 빠르게 통신할 수 있는 경로를 의미 (통신 경로상 최단거리를 의미하는 건 아님!) 프로토콜 - 한 마디로 규약, 데이터 교환을 효율적으로 만드는 기능 수행 왜 이런 규약을 만드느냐!? -> 효율적인 정보 교환을 위해서, 만약 규칙이 없다면 원활한 정보 교환이 이루어지기 어..
2020/10/26 - [Swift&iOS/iOS] - [iOS] Cell을 재사용 시 생기는 문제점들과 해결 방법에 이어서 오늘은 셀을 재사용함으로써 생기는 조금 더 심화적인 문제를 다뤄보려 합니다. 이전 글에서는 셀의 index 별로 터치 됐다 안됐다를 기준으로 하트 버튼의 상태를 변경해 줬었는데요. 이제 하트 버튼이 동작하도록 해볼 예정입니다. 셀 안에 스위치, 체크박스, 하트(좋아요)와 같은 버튼등이 들어가게 되면 상황이 조금 골치 아파집니다. 셀을 재활용하기 때문에, 누르지도 않은 인덱스에 버튼이 눌려져 있다던가 아니면 눌렀는데도 버튼이 안 눌려져 있다던가... 다음 보시는 것처럼 스크롤 몇 번 해보면 아주 뒤죽박죽 난장판이 됩니다. ㅜㅜ 이 문제를 해결하기 위해서는 사용자가 버튼을 눌렀을 때 ..
우리는 테이블 뷰와 컬렉션 뷰를 설계할 때 그냥 셀을 사용하지 않고 재활용 셀(dequeueReusableCell)을 사용합니다. 왜 그냥 셀을 사용하지 않고 재활용 셀을 사용하느냐!? 만약에 우리가 테이블 뷰나 컬렉션 뷰에 표현해야 할 셀이 1만 개라고 해봅시다. 만약 셀을 재활용해서 사용하지 않는다면, 우리는 메모리에 1만 개의 셀을 갖고 있어야 합니다. 너무 메모리 관리 측면에서 비효율적이라는 것이죠. 특히나 아이폰은 유독 안드로이드 폰보다 램이 작은 거 아시죠? ㅎㅎ; 아무튼 그렇기 때문에 1만 개의 데이터를 표현하더라도 재활용 셀을 사용하면 메모리에는 화면에 보이는 10~20개의 셀만 갖고 있게 됩니다. 하지만 셀을 재활용하다 보니 생기는 문제점들이 몇 가지 있는데요. 대표적인 문제점이 바로 셀..
안녕하세요! 오늘은 메모이제이션(Memoization)에 대해 알아보려 합니다. 메모이제이션이 뭐냐?? 메모이제이션은 동일한 연산을 반복해야 할 때 이전에 연산한 값을 메모리에 미리 저장해 둠으로써 계산의 반복수행을 제거하여 프로그램 실행 속도를 향상시키는 기술입니다. 메모리에 저장해뒀다가 사용한다는 점에 있어서 캐싱의 범주에 속한다고 보면 될 것 같은데요. 메모이제이션은 어떤 함수의 인풋에 대한 아웃풋을 저장한다고 보시면 되고 (함수를 위한 캐싱), 우리가 보통 말하는 캐싱은 외부에서 들어오는 파일, 데이터를 저장해서 사용하는 용어로 생각하시면 될 것 같습니다. (혹시라도 틀린 부분이 있다면 꼭 댓글 남겨주세요!) 메모이제이션의 특징으로는, 보통 실행 속도가 빠른 알고리즘이 더 많은 메모리를 사용하듯이..
뭐 정말 별거 없지만.. leetcode 사용기? 사용방법? 에 대해 포스팅 해보려 합니다. 우리나라에서 유명한 알고리즘 문제풀이 사이트로는 백준, 프로그래머스 등이 있을 텐데요. 외국에서는 leetcode가? 유명한것 같습니다. 구글, 페이스북, 아마존 등.. 유수의 IT기업 코딩테스트를 준비하기 위해서 leetcode를 통해 공부하는 것 같네요. 그래서 만약 다양한 문제를 풀어보시고 싶으시거나 해외취업을 생각하시는 분들은 leetcode에 있는 문제를 많이 풀어보시는면 좋을 것 같습니다! 우선 leetcode.com에 들어가셔 회원가입을 하셔야 하는데요. 회원가입 절차라고 할 것도 따로 없네요;; 그냥 구글로 회원가입 하면 특별히 양식같은거 기입 안해도 됩니다 ㅎㅎ; 이제 로그인 후, 최상단에 Pro..
SOLID?? -> 객체지향 5가지 원칙의 앞글자를 따서 지은 이름, 이 원칙을 따라 프로그램을 설계하면 유지 보수 및 확장이 쉬운 소프트웨어를 만들 수 있음 1. 단일 책임의 원칙 (Single Responsibility Principle) 객체는 오직 하나의 책임을 가져야 함 -> 클래스의 목적을 명확히 함으로써 기능을 명확히 분리 기능이 명확히 분리되어 있어야 유지보수에 유리하다!! 2. 개방-폐쇄 원칙(Open-Closed Principle) 객체는 확장에 대해서는 개방적이되 수정에 대해서는 폐쇄적이어야 함. 3. 리스코프 치환 원칙 (Liskov Substitution Principle) 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다. 부모 클래스가 들어갈 자리에 자식 클래스를 넣어..
안녕하세요 ㅎㅎ 오늘은 알고리즘 문제풀이 시 가장 많이 사용하는 리스트(list), 집합(set), 딕셔너리(dictionary) 메서드의 시간 복잡도를 정리해보려 합니다. 본격적인 시작전에 왜 여러 자료형들의 메서드에 대한 시간 복잡도를 알아야 하는지 짚고 넘어갑시다! 보통 알고리즘 문제 풀때 리스트로 큐를 구현하시는 분들이 많으실 텐데요. 여기 큐를 pop하는 반복문을 돌려서 풀어야 하는 문제가 있다고 가정해 봅시다. 만약 리스로 큐를 구현했다면 다음과 같이 나타낼 수 있는데요. 리스트의 경우 마지막 원소를 pop하는 연산의 시간 복잡도는 O(1)이지만, 그 외의 원소를 pop할 경우 원소를 한 칸씩 당기기 때문에 시간 복잡도는 O(N)이 되게 됩니다. 결국 반복문과 중첩되니 전체적인 시간 복잡도는 ..
오늘은 프로그래머스의 코딩 테스트 고득점 Kit에 들어있는 DFS/BFS문제를 풀어보려 합니다. DFS/BFS는 코딩테스트에 자주 나오는 유형이니 4문제 다 풀어보면 좋을 것 같네요 오늘 풀어볼 문제는 여행경로입니다. programmers.co.kr/learn/courses/30/lessons/43164 처음 문제를 읽고 레벨3치고는 쉽네? 생각했는데, 테스트 케이스 1번 때문에 생각보다 애를 먹었네요. 그래서 아예 풀이를 갈아엎고 다시 풀었다는.. ㅜㅜ 저의 접근 방식은 이렇습니다. 1. 주어진 배열을 그래프로 만든다. (그래프 만드는 방법은 다양한 방법이 있겠지만, 저는 딕셔너리를 사용해서 인접 리스트 형식으로 만들었습니다.) 2. 큐를 만들고 (출발 노드, [경로]) 넣어준다. (처음엔 출발점이 무..
오늘은 기초적인 정렬 알고리즘을 알아보려 합니다. 대표적인 정렬 알고리즘으로는 선택 정렬, 버블 정렬(거품 정렬), 삽입 정렬, 셸 정렬(쉘 정렬), 병합 정렬, 퀵 정렬 등이 있는데요. 간단하게 선택 정렬, 버블 정렬, 삽입 정렬, 쉘 정렬 네 가지 정렬의 정의와 코드를 정리하고 각각의 알고리즘 실행 속도를 측정하여 성능을 비교해 보려 합니다. 1. 선택 정렬 주어진 배열에서 가장 작은 원소를 찾아 첫 번째 원소와 교환하고 두 번째 작은 원소를 찾아 두 번째 원소와 교환하고... 반복하는 정렬 방법 정렬 방법 1. 주어진 배열 중 최솟값을 찾는다. 2. 그 최솟값을 맨 앞의 원소와 교환한다. 3. (N-1)원소에 대해 1-2 방법 반복 소스코드(파이썬) def select_sort(a: list) ->..