일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Premiere
- 구루미biz(gooroomeebiz)
- suno
- 프리미어
- 구루미biz
- BrainCar
- 3D모델링
- 3dmodeling
- 구루미 장애사항
- 22ww.tistory.com
- 3Dprinting
- seoulmysoul
- 3d
- 3D modeling
- LayerCutting
- 구루미비즈
- 볼트 모델링
- laserutting
- 구루미 고객센터
- 무드등
- 레이저커팅
- micro-bit
- FUSION 360
- 3D PRINTING
- 3D프린팅
- fusion360
- lasercutting
- 3D 모델링
- 서울마이소울
- ChatGPT
- Today
- Total
CodingMaker
파이썬 코드 해석 및 결과값 본문
소스코드 사이트: https://colorscripter.com
🟦 1. 자바 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
String[] sM = new String[3];
void func(String[] sM, int size){
for(int i = 1; i < size; i++){
if(sM[i - 1].equals(sM[i])){
System.out.print("O");
} else {
System.out.print("N");
}
for (String m : sM){
System.out.print(m);
}
}
}
void main(){
sM[0] = "A";
sM[1] = "A";
sM[2] = new String("A");
func(sM, 3);
}
|
최종 출력: OOAAA
🟦 2. 파이썬 코드
1
2
3
4
5
6
7
|
def func(lst):
for i in range(len(lst) // 2):
lst[i], lst[-i-1] = lst[-i-1], lst[i]
lst = [1, 2, 3, 4, 5, 6]
func(lst)
print(sum(lst[::2]) - sum(lst[1::2]))
|
- 초기 리스트:
-
pythonlst = [1, 2, 3, 4, 5, 6]
- func(lst) 함수 실행:
- func 함수는 리스트의 앞과 뒤를 교환합니다. len(lst) // 2는 3이므로 i = 0, 1, 2로 반복합니다.
- i = 0: lst[0]과 lst[-1]을 교환 → lst[0] = 1과 lst[5] = 6 → 결과: [6, 2, 3, 4, 5, 1]
- i = 1: lst[1]과 lst[-2]을 교환 → lst[1] = 2와 lst[4] = 5 → 결과: [6, 5, 3, 4, 2, 1]
- i = 2: lst[2]과 lst[-3]을 교환 → lst[2] = 3과 lst[3] = 4 → 결과: [6, 5, 4, 3, 2, 1]
- sum(lst[::2]) - sum(lst[1::2]) 계산:
- lst[::2]는 인덱스 0, 2, 4에 있는 값을 선택합니다. 즉, [6, 4, 2]입니다.
- 이들의 합: 6 + 4 + 2 = 12
- lst[1::2]는 인덱스 1, 3, 5에 있는 값을 선택합니다. 즉, [5, 3, 1]입니다.
- 이들의 합: 5 + 3 + 1 = 9
- 따라서, sum(lst[::2]) - sum(lst[1::2])는 12 - 9 = 3입니다.
- lst[::2]는 인덱스 0, 2, 4에 있는 값을 선택합니다. 즉, [6, 4, 2]입니다.
최종 출력: 3
🟦 3. SQL 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
|
select count(*)
from employees e
join projects p ON e.dept_id = p.dept_id
where p.name in (
select name
from projects
where p.dept_id in (
select dept_id
from projects
group by dept_id
having count(*) < 2
)
)
|
employees 테이블:
idfirst_namelast_namedept_id
1 | John | Doe | 100 |
2 | Jim | Carry | 200 |
3 | Rachel | Redmond | 100 |
projects 테이블:
namedept_id
Alpha | 10 |
Beta | 20 |
Charlie | 30 |
1. 첫 번째 서브쿼리:
이 부분에서는 projects 테이블에서 각 부서별로 프로젝트 수를 그룹화한 뒤, 각 부서에 속한 프로젝트가 1개 미만인 부서를 찾고 있습니다.
- 부서 10 (Alpha): 프로젝트 개수 1개 → 조건에 맞음
- 부서 20 (Beta): 프로젝트 개수 1개 → 조건에 맞음
- 부서 30 (Charlie): 프로젝트 개수 1개 → 조건에 맞음
따라서, 이 서브쿼리는 dept_id = 10, 20, 30을 반환합니다.
2. 두 번째 서브쿼리:
위에서 구한 부서(dept_id가 10, 20, 30인 부서들)에 해당하는 프로젝트들의 이름을 가져옵니다. 결과적으로, 부서 10, 20, 30에 해당하는 프로젝트들은:
- 부서 10: Alpha
- 부서 20: Beta
- 부서 30: Charlie
따라서, 이 서브쿼리는 ('Alpha', 'Beta', 'Charlie')라는 프로젝트 이름을 반환합니다.
3. 메인 쿼리:
이 부분에서는 employees 테이블과 projects 테이블을 dept_id로 조인한 후, p.name이 ('Alpha', 'Beta', 'Charlie')인 경우를 찾고 있습니다.
- 부서 10에 속한 직원은 John과 Rachel입니다.
- 부서 20에 속한 직원은 Jim입니다.
- 부서 30에 속한 직원은 없습니다.
따라서, 부서 10과 20에서 각각 John, Rachel, Jim이 해당하지만, 쿼리 조건에서 p.name in ('Alpha', 'Beta', 'Charlie') 에 해당하는 프로젝트와 관련된 부서에서 직원이 1명만 조건에 맞습니다.
결론:
쿼리에서 **count(*)**가 1인 이유는 부서 10과 20에서 두 명의 직원이 있지만, 부서 10과 부서 20 모두 하나의 프로젝트만 해당하고 조건에 맞는 직원 수가 1명만 해당된다는 점입니다.
최종 출력: 1
🟦 4. 페이지 교체 알고리즘: LRU (Least Recently Used)
🟦 5. 스머핑: IP나 ICMP의 특성을 악용 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크를 불능 상태로 만드는 공격 방법.
🟦 6. 행위패턴: 작업 수행을 위해 상호작용
- Iterator
- 내부구조 노출하지 않고 순차적으로 접근함
- 반복 프로세스를 캡슐화
- Mediator
- 객체간 상호작용 캡슐화
- 중재자역할
- 결합도 감소
- Visitor
- 객체의 구조와 처리 기능을 분리함
- 캡슐화에 위배됨
- 객체 내부 상태에 접근하는 방법을 제공하여 객체에 연산 추가할 수 있게 함
- 기존코드 변경없이 새로운 기능 추가
- Observer
- 한 객체에 상태변화 생기면 의존하는 다른 객체들에게 알려주고, 자동으로 내용이 갱신됨
- 일대다 의존성 패턴
- 모니터링
- Strategy
- 다양한 알고리즘을 캡슐화
- 알고리즘 교환해서 사용가능하게 한 패턴
- Command
- 요청을 캡슐화 함
🟦 7. C코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
int increase() {
static int x = 0;
x += 2;
return x;
}
int main() {
int x = 1;
int sum = 0;
for (int i = 0; i < 4; i++) {
x++;
sum += increase();
}
printf("%d", sum);
}
|
코드 분석:
-
- increase() 함수:
- 이 함수는 static 변수 x를 사용합니다.
- static 변수는 프로그램이 실행되는 동안 값이 유지되며, 함수가 호출될 때마다 초기화되지 않습니다.
- 처음 호출 시 x는 0에서 시작하며, 호출될 때마다 x에 2가 더해지고 반환됩니다.
- main() 함수:
- 지역 변수 x와 sum이 초기화됩니다.
- x = 1
- sum = 0
- for 루프는 4번 반복됩니다.
- 매 반복마다 x++가 실행되지만, 이 x는 지역 변수이므로 increase() 함수의 x와는 전혀 상관이 없습니다.
- sum은 increase() 함수의 반환 값을 누적합니다.
- 지역 변수 x와 sum이 초기화됩니다.
- for 루프 내부:
- increase() 함수가 호출될 때마다 static x의 값이 증가합니다.
- 호출 순서대로 반환되는 값은 다음과 같습니다:
- 첫 번째 호출: static x = 0 + 2 = 2 (반환값 2)
- 두 번째 호출: static x = 2 + 2 = 4 (반환값 4)
- 세 번째 호출: static x = 4 + 2 = 6 (반환값 6)
- 네 번째 호출: static x = 6 + 2 = 8 (반환값 8)
- sum 계산:
- sum = 2 + 4 + 6 + 8 = 20
- 최종 출력:
- printf("%d", sum);가 실행되어 20이 출력됩니다.
- increase() 함수:
🟦 8. 개체무결성
🟦 9.
43125
🟦 10. 파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def func(value):
if type(value) == type(100): # value가 정수(int) 타입인지 확인
return value + 1
elif type(value) == type(""): # value가 문자열(str) 타입인지 확인
return len(value)
else:
return 20 # 그 외의 타입은 20 반환
a = "100.0" # 문자열
b = 100 # 정수
c = (100.0, 200.0) # 튜플
print(func(a) + func(b) + func(c))
|
출력값: 45
🟦 11. 자바코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class Base {
int x = 3;
int getX() {
return x * 2; // 구체적인 값은 기억나지 않지만 중요하지 않음.
}
}
public class Derivate extends Base {
int x = 7;
@Override
int getX() {
return x * 3;
}
}
public class Main {
public static void main(String[] args) {
Base a = new Derivate(); // 업캐스팅된 객체
Derivate b = new Derivate();
System.out.print(a.getX() + a.x + b.getX() + b.x);
}
}
|
1. 핵심 개념 정리:
- 필드와 메서드 호출 규칙:
- 필드(x)는 참조 변수의 타입에 따라 접근합니다.
- 메서드(getX)는 런타임 객체의 타입에 따라 호출됩니다 (다형성).
- 업캐스팅:
- Base a = new Derivate();는 업캐스팅입니다.
- a는 Base 타입 참조 변수로, a.x는 **Base 클래스의 x 필드(3)**를 참조합니다.
- 그러나 a.getX()는 Derivate 클래스의 오버라이드된 메서드를 호출합니다.
- b는 Derivate 타입:
- b.getX()는 Derivate 클래스의 오버라이드된 메서드를 호출합니다.
- b.x는 Derivate 클래스의 필드(7)를 참조합니다.
2. 실행 흐름:
- a.getX() 호출:
- a는 Base 타입이지만 실제 객체는 Derivate 타입입니다.
- 따라서 Derivate 클래스의 getX() 메서드가 호출됩니다.
- Derivate.getX()의 계산: x * 3에서 **x는 Derivate 클래스의 x 필드(7)**입니다.
-
css코드 복사a.getX() = 7 * 3 = 21
- a.x 참조:
- a의 타입은 Base이므로, Base 클래스의 x 필드 값(3)을 참조합니다.
css코드 복사a.x = 3
- a의 타입은 Base이므로, Base 클래스의 x 필드 값(3)을 참조합니다.
- b.getX() 호출:
- b는 Derivate 타입이므로 Derivate.getX() 메서드가 호출됩니다.
- b.getX()의 계산: x * 3에서 **x는 Derivate 클래스의 x 필드(7)**입니다.
css코드 복사b.getX() = 7 * 3 = 21
- b.x 참조:
- b의 타입은 Derivate이므로, Derivate 클래스의 x 필드 값(7)을 참조합니다.
css코드 복사b.x = 7
- b의 타입은 Derivate이므로, Derivate 클래스의 x 필드 값(7)을 참조합니다.
3. 최종 계산:
출력값: 52
🟦 12. cpp 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
struct Node {
int value;
Node* next;
};
void func(Node* node) {
while (node != NULL && node->next != NULL) {
int t = node->value;
node->value = node->next->value;
node->next->value = t;
node = node->next->next;
}
}
int main() {
Node n1{1, NULL};
Node n2{2, NULL};
Node n3{3, NULL};
n1.next = &n3;
n3.next = &n2;
func(&n1);
Node* current = &n1;
while (current != NULL) {
printf("%d", current->value);
current = current->next;
}
}
|
1. 데이터 구조의 초기 상태
링크드 리스트는 다음과 같이 구성됩니다:
각 노드의 값:
- n1.value = 1
- n3.value = 3
- n2.value = 2
2. func 함수의 동작
func 함수는 리스트의 노드 값들을 짝수 위치와 홀수 위치끼리 교환합니다.
구체적으로:
- node와 node->next의 값을 교환합니다.
- node를 두 칸 앞으로 이동 (node = node->next->next).
과정 상세 분석:
- 첫 번째 반복:
- node = n1, node->next = n3
- 값 교환:
-
arduino코드 복사t = n1.value; // t = 1 n1.value = n3.value; // n1.value = 3 n3.value = t; // n3.value = 1
- 리스트 상태:
scss코드 복사n1(3) -> n3(1) -> n2(2) -> NULL
- node = n3->next = n2 (두 칸 앞으로 이동)
- 두 번째 반복:
- node = n2, node->next = NULL
- 루프 종료 (node->next == NULL 조건).
3. func 호출 이후의 리스트 상태
리스트는 다음과 같이 변경됩니다:
4. main 함수의 출력
main 함수에서 current 포인터를 이용하여 리스트를 순회하면서 각 노드의 값을 출력합니다.
- 첫 번째 노드: n1.value = 3
- 두 번째 노드: n3.value = 1
- 세 번째 노드: n2.value = 2
출력 순서: 3, 1, 2
🟦 13. 문장, 분기, 조건
화이트 박스 테스트의 유형
🟦 14. 연관, 일반화, 의존
일반화, 의존화 등 자동차 설명되있던거
1.
차
/ | \
바퀴, 타이어, 엔진
2.
차
/ | \
버스, 승용차, 택시
3.
텔레비전 --> 리모컨
기존 객체가 변경되면 다른 객체도 변경된다.
🟦 15. 용어
1. 다른 테이블 릴레이션 참조 ① 외래키
2. 유일성과 최소성 만족 ② 후보키
3. 기본키말고 후보키 ③ 대체키
4. 유일성만 만족 ④ 슈퍼키
🟦 16. C코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void func1(int** arr, int size) {
for (int i = 0; i < size; i++) {
*(*arr + i) = (*(*arr + i) + i) % size;
}
}
void func2(int* val, int* arr) {
*val = arr[*val % 4];
}
int main() {
int arr[] = {3, 1, 4, 1, 5};
int* p = arr;
int** pp = &p;
int num = 6;
func1(pp, 5);
func2(&num, arr);
printf("%d", num);
}
|
코드 분석:
1. func1(pp, 5) 호출:
func1 함수는 이중 포인터 int** arr와 배열의 크기 size를 매개변수로 받습니다.
- 배열의 각 요소는 다음 수식으로 업데이트됩니다:
c코드 복사*(*arr + i) = (*(*arr + i) + i) % size;
- 여기서:
- *arr는 p를 가리키고, p는 arr 배열의 시작 주소를 가리킵니다.
- 따라서 *(*arr + i)는 배열 arr[i]를 가리킵니다.
초기 배열: arr = {3, 1, 4, 1, 5}
배열의 각 요소가 업데이트되는 과정을 살펴봅시다:
- i = 0:배열: {3, 1, 4, 1, 5}
-
scssarr[0] = (arr[0] + 0) % 5 = (3 + 0) % 5 = 3
- i = 1:배열: {3, 2, 4, 1, 5}
-
scssarr[1] = (arr[1] + 1) % 5 = (1 + 1) % 5 = 2
- i = 2:배열: {3, 2, 1, 1, 5}
-
scssarr[2] = (arr[2] + 2) % 5 = (4 + 2) % 5 = 1
- i = 3:배열: {3, 2, 1, 4, 5}
-
scssarr[3] = (arr[3] + 3) % 5 = (1 + 3) % 5 = 4
- i = 4:배열: {3, 2, 1, 4, 4}
-
scssarr[4] = (arr[4] + 4) % 5 = (5 + 4) % 5 = 4
최종 배열 상태:
arr = {3, 2, 1, 4, 4}
2. func2(&num, arr) 호출:
func2 함수는 포인터 val과 배열 arr을 매개변수로 받습니다.
- *val = arr[*val % 4];
- *val은 num을 가리킵니다.
- 초기 num = 6.
- 6 % 4 = 2, 따라서 arr[2]가 사용됩니다.
- arr[2] = 1.
결과: num = 1
3. printf("%d", num) 출력: 1
🟦 17. VPN(Virtual Private Network): 이용자가 인터넷과 같은 공중망에 사설망을 구축하여 마치 전용망을 사용하는 효과를 가지는 보안 솔루션
"""IPsec ()"", ""SSL ()""로 쓰이며 가상에 대한 키워드, 사설망과 공용망?
🟦 18. 자바코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class ExceptionHandling {
public static void main(String[] args) {
int sum = 0;
try {
func();
} catch (NullPointerException e) {
sum = sum + 1; // NullPointerException 발생 시 실행
} catch (Exception e) {
sum = sum + 10; // 일반 Exception 발생 시 실행
} finally {
sum = sum + 100; // 항상 실행
}
System.out.print(sum);
}
static void func() throws Exception {
throw new NullPointerException(); // NullPointerException 발생
}
}
|
코드 실행 흐름:
- main() 메서드:
- sum 변수를 0으로 초기화합니다.
- try 블록 내에서 func() 메서드를 호출합니다.
- func() 메서드:
- 이 메서드는 throws Exception으로 선언되어 있어 Exception 계열의 예외를 발생시킬 수 있습니다.
- func() 메서드 호출 시 throw new NullPointerException()이 실행됩니다.
- 예외 처리 블록:
- try 블록에서 NullPointerException이 발생합니다.
- 첫 번째 catch (NullPointerException e) 블록이 실행됩니다.
- sum은 0 + 1 = 1이 됩니다.
- 두 번째 catch (Exception e) 블록은 실행되지 않습니다. (NullPointerException은 첫 번째 catch에서 처리되었기 때문입니다.)
- finally 블록:
- 예외 발생 여부와 관계없이 항상 실행됩니다.
- sum에 100이 추가됩니다.
- sum은 1 + 100 = 101이 됩니다.
출력: 최종적으로 System.out.print(sum);이 실행되어 101이 출력
🟦 19. 자바코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
class Main {
public static void main(String[] args) {
new Collection<>(0).print();
}
public static class Collection<T> {
T value;
public Collection(T t) {
value = t;
}
public void print() {
new Printer().print(value);
}
class Printer {
void print(Integer a) {
System.out.print("A" + a);
}
void print(Object a) {
System.out.print("B" + a);
}
void print(Number a) {
System.out.print("C" + a);
}
}
}
}
|
코드 분석:
- main 메서드:
- Collection 클래스의 객체가 생성됩니다: new Collection<>(0).
- T는 제네릭 타입으로 지정되며, 여기서는 Integer 타입으로 유추됩니다(0이 Integer로 자동 박싱됨).
- print() 메서드가 호출됩니다.
- Collection 클래스의 객체가 생성됩니다: new Collection<>(0).
- Collection 클래스:
- value라는 필드에 생성자로 전달된 값 0이 저장됩니다.
- print() 메서드에서는 Printer 클래스의 인스턴스를 생성하고, 해당 인스턴스의 print(value) 메서드를 호출합니다.
- Printer 클래스의 print 메서드들:
- Printer 클래스는 Integer, Object, Number 타입에 대해 각각 오버로드된 print 메서드를 제공합니다.
- 호출 시 어떤 메서드가 실행될지는 컴파일 타임에 메서드 선택이 결정됩니다.
- value는 **제네릭 타입 T**로 선언되었고, 이 타입은 런타임 시에는 Object로 간주됩니다(타입 소거: Type Erasure).
- 메서드 호출 결정:
- value의 컴파일 타임 타입은 T로 선언되어 있습니다. 하지만 런타임 타입은 Integer입니다.
- 컴파일러는 value의 컴파일 타임 타입(즉, Object)만을 참고하여 적합한 메서드를 선택합니다.
따라서 Printer 클래스의 void print(Object a) 메서드가 호출됩니다.
출력: Printer의 print(Object a) 메서드가 실행되므로 출력값은: B0
Java에서는 제네릭 타입 소거(Type Erasure)로 인해 런타임 시에는 타입 정보가 손실되므로, 메서드 오버로딩 시 컴파일 타임 타입이 중요합니다.
🟦 20. 애드 혹 네트워크 (Ad-hoc Network)
재난 현장과 같이 별도의 고정된 유선망을 구축할 수 없는 장소에서 모바일 호스트(Mobile Host)만을 이용하여 구성한 네트워크이다.
망을 구성한 후 단기간 사용되는 경우나 유선망을 구성하기 어려운 경우에 적합하다.
네트워크는 노드(Node)들에 의해 자율적으로 구성되는 기반 구조가 없는 네트워크로 긴급 구조, 긴급회의, 전쟁터에서의 군사 네트워크로 활용됨
'Python' 카테고리의 다른 글
Python (0) | 2019.12.03 |
---|---|
Python 제어문 (1) | 2019.12.02 |
Python에서 아두이노 서보 모터 움직이기 (0) | 2018.05.08 |
아두이노에서 Python으로 문자열 보내기 (1) | 2018.04.24 |
파이썬에서 아두이노로 문자 또는 숫자 보내기 (8) | 2018.04.17 |