https://programmers.co.kr/learn/courses/30/lessons/12915?language=python3

def solution(strings, n):
    return sorted(sorted(strings), key=lambda x: x[n])

 

굉장히 짧은 코드이지만 후에 lambda에 대해 이해하기 좋을 것 같아 포스팅해 둔다.

 

map(lambda x: x+2, range(5)) → range(5)에서 하나씩 가져와서 x+2를 한다.

 

sorted(strings, key=lambda x: x[n]) → strings에서 하나씩(x) 가져와서 정렬기준인 key로 삼는데, 그냥 x가 아니라 x[n]을 key로 삼는다.

'알고리즘 > 문자열' 카테고리의 다른 글

스킬트리 (Python)  (0) 2020.07.09
  • 정적 웹 프로그래밍: 사용자에게 화면 디자인 같은 고정된 정보만 제공한다. 정보 수정 시 관리자가 직접 HTML 소스를 수정해야 한다.

 

  • 동적 웹 프로그래밍: 정적 웹 프로그래밍에서 관리자가 하던 역할을 웹 애플리케이션 서버(WAS)가 수행한다. WAS는 웹 서버 백단에서 데이터베이스에 접근하는 서버로, 클라이언트의 요청이 있을 때마다 데이터베이스에 질의해서 실시간 정보를 제공한다.
    • CGI 방식: WAS에서 실행되는 기능들이 모두 프로세스 방식으로 실행된다. 같은 기능을 수행하더라도 처음부터 기능을 메모리에 로드해서 사용해야 하므로 과부하가 생길 수 있다. (ex. Pearl 언어)
    • JSP (ASP, PHP) 방식: WAS에서 실행되는 기능들이 스레드 방식으로 실행된다. 한번 기능을 메모리에 로드하면, 다음에 요청이 들어왔을 때 이전에 메모리에 올라왔던 기능을 재사용한다. 

'응용 > Web' 카테고리의 다른 글

웹 프레임워크 (Flask)  (0) 2020.04.17

객체의 비구조화 할당 혹은 구조분해 할당이라는 심오한 이름을 갖고있는 이것은 쉽게 말해서 구조체 안의 여러 값들을 불러올 때 짧게 쓰자는 것이다.

 

const myDog = {
    name: '멍멍이',
    age: 3,
    character: 귀여움
}

위와 같은 객체가 있을 때, 함수 내에서 객체의 속성(이름, 나이, 성격)을 불러오고 싶으면 myDog.name, myDog.age, myDog.character 등으로 불러와야 한다.

하지만 어차피 myDog의 값을 불러오는 건데, 계속 같은 타자를 치는 것은 귀찮은 일이다. 이럴때 짧게 불러올수있는 것이 바로 이 심오한 이름의 비구조화할당 혹은 구조분해할당이다.

 

const myDog = {
  name: "멍멍이",
  age: 3,
  character: "귀여움"
};


// non 비구조화 할당
function print_1(dog) {
  console.log(
    `우리 강아지 이름은 ${dog.name}, 나이는 ${dog.age}, 성격은 ${dog.character}`
  );
}


// 비구조화할당 방법1
function print_2(dog) {
  const { name, age, character } = dog;
  console.log(`우리 강아지 이름은 ${name}, 나이는 ${age}, 성격은 ${character}`);
}


// 비구조화할당 방법2
function print_3({ name, age, character }) {
  console.log(`우리 강아지 이름은 ${name}, 나이는 ${age}, 성격은 ${character}`);
}



// 비구조화할당 방법3
const { name, age, character } = myDog;
console.log(`우리 강아지 이름은 ${name}, 나이는 ${age}, 성격은 ${character}`);

'프론트엔드 > JavaScript' 카테고리의 다른 글

(Javascript) for, for - of, for - in  (0) 2020.07.15
(Javascript) for, forEach, map  (0) 2020.07.11
(JavaScript) 동기와 비동기  (0) 2020.07.06
(JavaScript) 배열  (0) 2020.06.11
(JavaScript) 변수의 타입  (0) 2020.06.11

2020. 06. 11

 

 

자바스크립트에서의 배열의 유연함을 구경하자.

let a = [1, "2", [3]];

a.length; // 3
a[0] === 1; // 결과: true. js에서 배열은 인덱스로 접근한다.
a[2][0] === 3; // 결과: true. 이차원 배열도 마찬가지이다.
a[3] = 4;  // 배열에는 미리 정해진 크기가 없으며, 언제든지 자유자재로 추가할 수 있다.


/* 가능은 하지만 사용에 주의해야 하는 것들 */
a[5] = 5; 
a.length  // 결과:5. 한 인덱스를 건너뛰고 추가하는 것도 가능하다. 
a[4];  // 결과: undefined. 건너뛴 배열의 값은 undefined지만, a[4] = undefined처럼 직접 대입한 것과 완벽히 같지는 않다고 한다.

a["last"] = 6;  // map처럼 인덱스를 문자열로 쓰는 것이 가능하다. 단, length는 늘어나지 않는다.
/****************************************/

let b = [ ];
b["99"] = 0;
b.length;  // 결과: 100. key로 10진수 모양의 문자열을 넣으면 숫자로 들어간다.

 

 

* 본 포스팅은 YOU DON'T KNOW JS를 요약한 것이며, 공부한 것을 정리하기 위한 목적임.

 

2020. 06. 11

 

 

1. 자바스크립트(ES6)에는 7가지 내장 타입이 존재한다.

  • null
  • undefined
  • boolean
  • number
  • string
  • object
  • symbol

symbol을 제외한 타입을 Primitive Type(원시 타입)이라고 부른다.

 

 

2. 값의 타입이 null인지 알아보기 위해서는

let a = null;
!a && typeof a === "object"; // true

그냥 typeof null은 "object"이기 때문이다. (버그 비스무리한 것이라고 한다.)

 

 

3. 자바스크립트에서 값은 타입이 존재하지만, 변수에는 타입이 없다. 변수에는 어떠한 타입의 값이라도 넣을 수 있다.

let a = 1;
a = "1";

a라는 변수에 숫자를 넣었다가 문자를 넣었다가 하는 것이 가능하다.

 

 

4. 자바스크립트에서 undefined는 undefined or undeclared 이다.

// debug.js에 let DEBUG = true; 라고 정의되어 있음.

if (DEBUG) {
	console.log("디버깅을 시작합니다.");
}  // 에러 발생

if (typeof DEBUG !== "undefined") {
	console.log("디버깅을 진짜 시작합니다.");
}  // 올바른 방법

if (typeof atob === "undefined") {
	atob = function() {
    	........
    }
} //  이것을 이용하면 내장 API 존재유무 확인도 가능

 

 

 

* 본 포스팅은 YOU DON'T KNOW JS를 요약한 것이며, 공부한 것을 정리하기 위함임.

인스턴스 변수: 클래스 바로 안쪽에 위치하며, 인스턴스가 생성되었을 때 실제 메모리가 할당된다.

 

클래스 변수: (=static 변수). 인스턴스 변수에 static을 붙이면 클래스 변수가 된다. 클래스 바로 안쪽에 위치하며, 해당 크래스로 만들어진 모든 인스턴스가 공유하게 되는 변수이다. 클래스이름.클래스변수와 같이 인스턴스를 생성하지 않고도 사용할 수 있다. 프로그램이 종료될 때 사라지며, 앞에 public을 붙이면 전역 변수와 같아진다.

 

인스턴스 변수와 클래스 변수를 멤버 변수라고 한다. 

 

지역 변수: 클래스->메서드 내에 선언됨. 블럭을 벗어나면 소멸함.

 

class Variables
{
    int n;  # 인스턴스 변수
    static int m;  # 클래스 변수 (Variables.m으로 바로 사용 가능)
    
    void method()
    {
    	int k = 0;  # 지역 변수
    }
}
# 1구역: 피벗(기준 원소)보다 작은 영역
# 2구역: 피벗(기준 원소)보다 큰 영역
# 3구역: 아직 보지 않은 영역


def partition(lst, s, e):
	i = s-1  # 1구역의 끝
	# 2구역은 i+1 ~ j-1
	pivot = A[e]  # 기준원소

	for j in range(s, e-1):  # 3구역의 범위
		if A[j] <= pivot:
			i += 1
			A[i], A[j] = A[j], A[i]  # 1구역을 하나 늘리고, 3구역과 swap
	A[i+1], A[e] = A[e], A[i+1]  # pivot과 2구역 첫번째 원소를 swap
	return i+1  # 2구역의 첫번째 원소를 return (그냥 중앙에 넣어주는 것)


def quick(A, s, e):
	if s < e:
		q = partition(A, s, e)
		quick(A, s, q-1)
		quick(A, q+1, e)


A = [31, 8, 48, 73, 11, 3, 20, 29, 65, 15]
quick(A, 0, len(A)-1)
print(A)

'CS > 알고리즘' 카테고리의 다른 글

Merge Sort in Python (병합 정렬)  (0) 2020.06.09
Insertion Sort in Python (삽입 정렬)  (0) 2020.06.09
크루스칼 알고리즘 (Python)  (0) 2020.05.07
프림 알고리즘 (Python)  (0) 2020.05.07
Call by Value vs Call by Reference  (0) 2020.04.28
import sys


def mergeSort(A, s, e):
	half = (s+e) // 2
	mergeSort(A, s, half)
	mergeSort(A, half+1, e)
	merge(A, s, half, e)


def merge(A, s, half, e):
	tmp = []
	i = s
	j = half+1
	while i <= half and j <= e:
		if A[i] < A[j]:
			tmp.append[A[i]]
			i += 1
	while i <= half:
		tmp.append[A[i]]
		i += 1
	while j <= e:
		tmp.append[A[j]]
		j += 1
	
	i = s
	j = 0
	while i <= e:
		A[i] = tmp[j]
		i += 1
		j += 1


sys.setrecursionlimit(10000)
A = [31, 3, 65, 73, 8, 11, 20, 29, 48, 15]
mergeSort(A, 0, len(A))
print(A)

'CS > 알고리즘' 카테고리의 다른 글

Quick Sort in Python (퀵 정렬)  (0) 2020.06.09
Insertion Sort in Python (삽입 정렬)  (0) 2020.06.09
크루스칼 알고리즘 (Python)  (0) 2020.05.07
프림 알고리즘 (Python)  (0) 2020.05.07
Call by Value vs Call by Reference  (0) 2020.04.28

+ Recent posts