1년에 3번의 기사 시험 중 1차나 3차 중 하나는 쉽게 나오는 편이다.
올해 2차 실기는 대체로 평범한 수준으로 출제되었고 합격률 20%를 기록했다.

3차는 조금 쉽게 나오지 않을까 기대했으나 결론은 '어려웠다.'
IT커뮤니티 수제비에서 수험생 639명을 대상으로 설문조사 한 결과
- 전체적인 체감난이도가 '어려웠다'고 답한 사람이 46.1%(299명)로 제일 많았고
- 이어서 '매우 어려웠다'고 답한 사람이 23%(149명)로 그 다음을 차지했다.
- 즉 이번 시험은 69.1%의 수험생이 어렵다고 느낀 시험으로 10명중 7명이 어려워하는 시험이었다.
문제유형 (20문제)
- 이론/용어 문제 (7문제)
- 프로그래밍 언어 (9문제)
- 데이터베이스 (3문제)
- 계산식 (1문제)
# 이론/용어 문제 (7)
보안 - 스머프/스머핑
보안 - VPN
웹 - URL
화이트박스 테스트의 종류 - 문장, 분기, 조건
소프트웨어 공학 - 연관, 일반화, 의존
디자인패턴 - 행위패턴
네트워크 - 애드혹
# 프로그래밍 문제 (9)
OOAAA 문제
파이썬의 리스트 인덱싱
sum구하기
print(func()+func()+func())
상속과 메서드오버라이딩 (아버지가 날 낳은 문제, 내가 나를 낳은 문제)
구조체와 포인터
배열
예외처리(NullPointerException)
제네릭 new Collection<>(0).print()
# 데이터베이스 (3)
SQL select count(*)
개체무결성
외래키/후보키/대체키/슈퍼키
#계산식
페이지부재 - LRU기법으로 3장의 페이지에 20개의 숫자 입출력하며 페이지 부재 횟수 계산
문제 1
자바 문자열 비교
문자열을 직접 배열에 넣은 경우와
new String 생성자를 통해서 값을 전달 해 준 경우
해당 배열 요소들은 같은 값으로 인식되는가 아닌가 비교하는 문제 (문자열 비교)
- 만약 String이라는 자료형이 내가 직접 생성한 것이라면 안에 equals() 를 구현 해 주어야 문자열이 같은 값이라고 인식된다.
- 하지만 String 은 내가 만든 자료형이 아니고 자바에서 이미 만들어져 있는 것이고 equals()가 다 구현이 되어 있기 때문에
- 직접 값을 집어 넣으나 생성자를 통해 넣어 주나 결국에는 같은 값으로 인식이 된다
- 배열 0 번 인덱스와 1번 인덱스는 같은 값이란 걸 쉽게 알 수 있는데, 1번과 2번은 같은 값인지 아닌지 헷갈리는 문제였다.
String[3] 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
파이썬 인덱싱 문제
- 인덱스가 음수(마이너스)인 경우 해당 인덱스의 위치를 이해하고 있는가
- 대입 연산자 앞 뒤로 값이 두 개씩 있어서 다소 생소한 표현
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]))
예상 답안 : 3
풀이 : 12-9
프로그래밍 언어 문제 중에는 그나마 쉬웠던 문제이다. 나는 이 문제를 틀렸다, 답까지 다 구해놓고 12에서 9를 빼야 하는데 더해서 21이라고 썼다. 간단히 풀이 하자면 리스트의 길이 6을 2로 나누면 3이 된다. 즉 반복문은 i = [0, 1, 2] 로 3회 돌아간다. 이 때 반복문에서 수행되는 프로그램은 양쪽 끝 인덱스의 요소를 서로 바꾸는 것이다.
i가 0일때 한 번만 계산식을 수행해 보면 lst[0] , lst[-1] = lst[-1], lst[0] 즉, 0번 인덱스와 -1번을 바꾸라는 것이다...
이처럼 0번 인덱스에 있는 값과 -1번 값이 바뀌고, 1번과 -2, 2번과 -3번이 바뀌며 최종적으로 리스트에는 처음 배열의 요소가 역순으로 들어가게 된다.
이 때 sum 함수를 수행하기 위해 인덱싱을 해 줘야 하는데
lst[초기값:끝값:증감]
이 때 lst[::2]에 초기값과 끝값이 지정되지 않은 경우 리스트의 처음부터 끝이라고 보기 때문에 0번 인덱스부터 2칸씩 띄어서 값을 더해가면 된다. 6,4,2의 합은 12가 된다. 또 lst[1::2] 는 1번째 인덱스에서부터 2칸씩 띄며 값을 가져와야 하므로 5+3+1을 해서 9가 된다.
결국 12-9는 3이다.
문제 3
정적변수(static 변수)을 이해했는지 & 변수의 유효 범위를 아는지 알아보는 문제
스태틱 변수는 처음에 메모리에 올라와서 한 번만 초기화되고, 그 이후에는 초기화 구문을 수행하지 않는다.
또한 작업이 종료될 때까지 메모리에 유지되며 그 값이 재사용된다.
또한 변수의 이름이 동일한 경우, (정적 변수와 main의 전역변수의 이름이 x로 동일)
계산을 수행하면서 x가 어떤 값을 가리키는지 생각해 볼 문제이다
int increase() {
static x = 0;
x += 2;
return x;
}
int main() {
int x = 1;
int sum = 0;
for(int i = 0; i < 4; j++) {
x++;
sum+=increase();
}
print("%d", sum);
}
/* 아... 티스토리 블로그는 항상 코드블럭에서 들여쓰기 오류가 남....
제가 잘못 쓴게 아니고, 안고쳐짐...
제발 티스토리 개발자들 이 오류좀 수정해 보세요....
한 두번이 아니고 매일 그래요
메인 영역에서 탭키 한번 누르고 x선언 했는데
코드블럭 작성창 나가면 탭키 두번 누른 상태로 표현됨..
다시 지우고 해 봐도 마찬가지.... */
예상 답안 : 20
풀이:
main 영역의 전역 변수가 1로 초기화 됨.
그리고 해당 for문에서 x++이 가리키는 것은 main영역의 전역변수임
4회 수행되는 동안 1씩 증가하여 메인 x는 최종적으로 5값이 되나
하지만 해당 전역 변수값은 중요한게 아니다...
결국 sum값을 출력해야 하기 때문
sum은 increase() 함수를 4번 호출해서 리턴받은 값의 누적합이다.
처음 increase() 호출시 static x가 0으로 초기화 됨.
그리고 나서 다음 반복문부터는 초기화 구문을 수행하지 않고 다음 구문부터 시작함. 4회 호출되는 동안 static x는 2,4,6,8이 됨 그리고 sum에 누적 되어 그 합은 20
여기서 static변수는 클래스에 속하는 변수로 모든 인스턴스가 공유하는 변수이다.
그래서 이 변수는 클래스가 메모리에 로드 될 때 한 번만 생성되고 종료될까지 메모리에 유지된다...
문제 4
밸류의 타입 비교
파이썬에서 문자열 "100.0" , 정수형100, 실수형100.0의 type(자료형) 비교하는 문제
비교군의 타입이 같으면 해당 밸류에 1을 더하고,
해당 값이 String타입이면 ""(빈 문자열)의 타입과 같으므로 value의 길이를 리턴
위 두 조건을 만족하지 않으면 20을 리턴한다.
func(a)만 elif 블록의 조건을 만족해서 "100.0"의 길이인 5를 리턴하고 나머지는 해당 사항 없어서 else구문을 수행해서 각 20을 리턴
5+20+20 은 45다. 여기서 중요한 것은 100.0의 길이 셀 때 점까지 세어야 한다는것
그리고 이 문제 풀면서 궁금했던 거는 (100.0, 200.0)는 타입이 뭐지??
type(튜플명) 하면 자료형이 뭐가 되는지 궁금하다
def func(value):
if type(value) == type(100):
return value+1
elif type(value) == type(""):
return len(value)
else:
return 20
a = "100.0"
b = 100
c = (100.0, 200.0)
print(func(a) + func(b) + func(c))
문제5
자바의 상속과 메서드 오버라이딩(재정의 문제)
- 자바에서 Derived 클래서가 Base 클래스를 상속 받음
- 이 때 둘다 이름이 같은 정수형 변수 x를 가짐
- 메서드가 오버라이딩 된 경우 동일한 이름의 메서드 중 하위클래스의 연산을 수행해야 함
public class Base{
int x = 3;
int getX(){
return x * 2;
}
}
public class Derived extends Base{
int x = 7;
@Override
int getX(){
return x * 3;
}
}
main() {
Base a = new Derived();
Derived b = new Derived();
System.out.print(a.getX()+a.x+b.getX()+b.x);
}
예상답안 : 52
풀이 :
메인 영역에서 시작
Base 타입의 인스턴스 a - 아버지가 날 낳은 형태
Derived 타입의 인스턴스 b - 자식이 자식을 낳은 형태
a 에는 Base.a = 3, Derived.a = 7 들어가 있는 상태
b 에도 Base.a = 3, Derived.a = 7 들어가 있는 상태
a.getX() 오버라이딩 했으므로 아들의 getX() 수행해서 7*3=21 가져옴
a.x 아버지의 x인 3 가져옴
b.getX() 오버라이딩 했음으로 아들의 getX() 수행해서 7*3=21 가져옴
b.x 아들의 x값인 7 가져옴
21+3+7+21 = 52
자바 다형성 개념 때문에 메서드 호출 시 객체의 실제 타입(여기서는 deprived)에 따라 오버라이딩 된 메서드가 호출 된다.
a의 타입은 Base 이지만 실제 객체는 derived로 생성자 태웠기 때문에 derived 클래스에서 오버라이딩 된 getX()가 호출됨
그리고 그 안에서 사용되는 x 또한 해당 연산이 이루어지는 공간인 derived 의 x값을 말한다
문제 6
C언어 구조체와 포인터 문제
이번에 출제된 문제 중 가장 긴 문제이다. 손으로 써 가면서 값만 잘 따라가면 무리없이 풀 수 있는 쉬운 문제이다.
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) {
print(current->value);
current = current->next;
}
}
예상 답안 : 312
main 영역에서 3개의 구조체 생성
정수형 변수 Value와 포인터 next를 값으로 가짐
주소값(가정) | Value | *next | |
100 | n1 | 1 | NULL |
200 | n2 | 2 | NULL |
300 | n3 | 3 | NULL |
n1의 next에 n3의 주소값 넣기
n3의 next에 n2의 주소값 넣기
그럼 아래와 같은 모습이 된다
주소값(가정) | Value | *next | |
100 | n1 | 1 | 300 |
200 | n2 | 2 | NULL |
300 | n3 | 3 | 200 |
이 때 n1을 매개변수로 func()를 호출하는데
노드가 null값이 아니고 노드의 next값이 null값이 아닌 동안은
int t 에 n1의 value 값을 넣어 주고, n1의 value 값 자리에는 해당 next가 가리키는 공간의 value값을 swap 하게 된다.
n1의 next는 300번지를 가리키므로 n3에 value 인 3과 n1 의 1이 자리바꿈 한다.
이후 수행된 node = node->next->next구문은 결국 null값을 가리키므로 여기서 연산은 종료된다.
node의 next는 300번지를 가지므로 n3를 가리키고 n3의 next는 200번지를 참조하므로 결국 200번지 의
NEXT가 NULL이라 while문이 종료되는 것
최종적인 구조체의 모습은 아래와 같다
주소값(가정) | Value | *next | |
100 | n1 | 3 | 300 |
200 | n2 | 2 | NULL |
300 | n3 | 1 | 200 |
그리고 current 라는 노트 타입의 포인터 변수를 선언해 주는데
그 값은 n1의 주소값을 참조하고 있다. 그러므로 current는 결국 n1과 같은공간을 가리키는 셈이다
current가 null 값이 아닌 동안 current의 value를 먼저 출력하고 나서 current의 next가 가리키는 이동한다
처음에는 n1이 가진 3 출력 후, 300번지로 가서 n3의 1을 출력, 그리고 n3의 next가 가리키는 200번지의 2를 출력한다
200번지에는 next 값이 NULL 이므로 프로그램이 종료 된다.
문제 7
예외처리 문제
- func() 함수 호출하면 NullPointerException 강제로 발생시킴
- NullPointerException e 블록에서 예외를 잡아 주면 Exception e 블럭은 수행 안 함
- finally 구문은 무조건 수행된다.
public class ExceptionHandling {
public static void main(String[] args) {
int sum = 0;
try {
func();
} catch (NullPointerException e) {
sum = sum + 1;
} catch (Exception e) {
sum = sum + 10;
} finally {
sum = sum + 100
}
System.out.print(sum)
}
static void func() throws Exception {
throws new NullPointerException();
}
}
예상 답안 : 101
왜? NullPointerException 이 있는 catch 블록 수행 후 finally 블록 수행하기 때문
포인터와 배열 문제,
제네릭 기법은 피곤해서 다음에 포스팅....ㅋㅋㅋㅋㅋㅋ
'Diary' 카테고리의 다른 글
✨리눅스마스터 2급 취득 후기 (시험 방식, 공부 방법, 난이도 등)✨ (5) | 2024.10.25 |
---|---|
우울할 때 보는 영상 ㅋㅋㅋㅋ (나만 볼꺼니까 클릭 노) (1) | 2024.10.24 |
빨리 눈 왔으면 좋겠다 (0) | 2024.10.17 |
24/04/06 오늘의 하루 : 새봄맞이 식물 심기 (0) | 2024.04.06 |
24/04/05 오늘의 일기 (0) | 2024.04.05 |
1년에 3번의 기사 시험 중 1차나 3차 중 하나는 쉽게 나오는 편이다.
올해 2차 실기는 대체로 평범한 수준으로 출제되었고 합격률 20%를 기록했다.

3차는 조금 쉽게 나오지 않을까 기대했으나 결론은 '어려웠다.'
IT커뮤니티 수제비에서 수험생 639명을 대상으로 설문조사 한 결과
- 전체적인 체감난이도가 '어려웠다'고 답한 사람이 46.1%(299명)로 제일 많았고
- 이어서 '매우 어려웠다'고 답한 사람이 23%(149명)로 그 다음을 차지했다.
- 즉 이번 시험은 69.1%의 수험생이 어렵다고 느낀 시험으로 10명중 7명이 어려워하는 시험이었다.
문제유형 (20문제)
- 이론/용어 문제 (7문제)
- 프로그래밍 언어 (9문제)
- 데이터베이스 (3문제)
- 계산식 (1문제)
# 이론/용어 문제 (7)
보안 - 스머프/스머핑
보안 - VPN
웹 - URL
화이트박스 테스트의 종류 - 문장, 분기, 조건
소프트웨어 공학 - 연관, 일반화, 의존
디자인패턴 - 행위패턴
네트워크 - 애드혹
# 프로그래밍 문제 (9)
OOAAA 문제
파이썬의 리스트 인덱싱
sum구하기
print(func()+func()+func())
상속과 메서드오버라이딩 (아버지가 날 낳은 문제, 내가 나를 낳은 문제)
구조체와 포인터
배열
예외처리(NullPointerException)
제네릭 new Collection<>(0).print()
# 데이터베이스 (3)
SQL select count(*)
개체무결성
외래키/후보키/대체키/슈퍼키
#계산식
페이지부재 - LRU기법으로 3장의 페이지에 20개의 숫자 입출력하며 페이지 부재 횟수 계산
문제 1
자바 문자열 비교
문자열을 직접 배열에 넣은 경우와
new String 생성자를 통해서 값을 전달 해 준 경우
해당 배열 요소들은 같은 값으로 인식되는가 아닌가 비교하는 문제 (문자열 비교)
- 만약 String이라는 자료형이 내가 직접 생성한 것이라면 안에 equals() 를 구현 해 주어야 문자열이 같은 값이라고 인식된다.
- 하지만 String 은 내가 만든 자료형이 아니고 자바에서 이미 만들어져 있는 것이고 equals()가 다 구현이 되어 있기 때문에
- 직접 값을 집어 넣으나 생성자를 통해 넣어 주나 결국에는 같은 값으로 인식이 된다
- 배열 0 번 인덱스와 1번 인덱스는 같은 값이란 걸 쉽게 알 수 있는데, 1번과 2번은 같은 값인지 아닌지 헷갈리는 문제였다.
String[3] 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
파이썬 인덱싱 문제
- 인덱스가 음수(마이너스)인 경우 해당 인덱스의 위치를 이해하고 있는가
- 대입 연산자 앞 뒤로 값이 두 개씩 있어서 다소 생소한 표현
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]))
예상 답안 : 3
풀이 : 12-9
프로그래밍 언어 문제 중에는 그나마 쉬웠던 문제이다. 나는 이 문제를 틀렸다, 답까지 다 구해놓고 12에서 9를 빼야 하는데 더해서 21이라고 썼다. 간단히 풀이 하자면 리스트의 길이 6을 2로 나누면 3이 된다. 즉 반복문은 i = [0, 1, 2] 로 3회 돌아간다. 이 때 반복문에서 수행되는 프로그램은 양쪽 끝 인덱스의 요소를 서로 바꾸는 것이다.
i가 0일때 한 번만 계산식을 수행해 보면 lst[0] , lst[-1] = lst[-1], lst[0] 즉, 0번 인덱스와 -1번을 바꾸라는 것이다...
이처럼 0번 인덱스에 있는 값과 -1번 값이 바뀌고, 1번과 -2, 2번과 -3번이 바뀌며 최종적으로 리스트에는 처음 배열의 요소가 역순으로 들어가게 된다.
이 때 sum 함수를 수행하기 위해 인덱싱을 해 줘야 하는데
lst[초기값:끝값:증감]
이 때 lst[::2]에 초기값과 끝값이 지정되지 않은 경우 리스트의 처음부터 끝이라고 보기 때문에 0번 인덱스부터 2칸씩 띄어서 값을 더해가면 된다. 6,4,2의 합은 12가 된다. 또 lst[1::2] 는 1번째 인덱스에서부터 2칸씩 띄며 값을 가져와야 하므로 5+3+1을 해서 9가 된다.
결국 12-9는 3이다.
문제 3
정적변수(static 변수)을 이해했는지 & 변수의 유효 범위를 아는지 알아보는 문제
스태틱 변수는 처음에 메모리에 올라와서 한 번만 초기화되고, 그 이후에는 초기화 구문을 수행하지 않는다.
또한 작업이 종료될 때까지 메모리에 유지되며 그 값이 재사용된다.
또한 변수의 이름이 동일한 경우, (정적 변수와 main의 전역변수의 이름이 x로 동일)
계산을 수행하면서 x가 어떤 값을 가리키는지 생각해 볼 문제이다
int increase() { static x = 0; x += 2; return x; } int main() { int x = 1; int sum = 0; for(int i = 0; i < 4; j++) { x++; sum+=increase(); } print("%d", sum); }
/* 아... 티스토리 블로그는 항상 코드블럭에서 들여쓰기 오류가 남....
제가 잘못 쓴게 아니고, 안고쳐짐...
제발 티스토리 개발자들 이 오류좀 수정해 보세요....
한 두번이 아니고 매일 그래요
메인 영역에서 탭키 한번 누르고 x선언 했는데
코드블럭 작성창 나가면 탭키 두번 누른 상태로 표현됨..
다시 지우고 해 봐도 마찬가지.... */
예상 답안 : 20
풀이:
main 영역의 전역 변수가 1로 초기화 됨.
그리고 해당 for문에서 x++이 가리키는 것은 main영역의 전역변수임
4회 수행되는 동안 1씩 증가하여 메인 x는 최종적으로 5값이 되나
하지만 해당 전역 변수값은 중요한게 아니다...
결국 sum값을 출력해야 하기 때문
sum은 increase() 함수를 4번 호출해서 리턴받은 값의 누적합이다.
처음 increase() 호출시 static x가 0으로 초기화 됨.
그리고 나서 다음 반복문부터는 초기화 구문을 수행하지 않고 다음 구문부터 시작함. 4회 호출되는 동안 static x는 2,4,6,8이 됨 그리고 sum에 누적 되어 그 합은 20
여기서 static변수는 클래스에 속하는 변수로 모든 인스턴스가 공유하는 변수이다.
그래서 이 변수는 클래스가 메모리에 로드 될 때 한 번만 생성되고 종료될까지 메모리에 유지된다...
문제 4
밸류의 타입 비교
파이썬에서 문자열 "100.0" , 정수형100, 실수형100.0의 type(자료형) 비교하는 문제
비교군의 타입이 같으면 해당 밸류에 1을 더하고,
해당 값이 String타입이면 ""(빈 문자열)의 타입과 같으므로 value의 길이를 리턴
위 두 조건을 만족하지 않으면 20을 리턴한다.
func(a)만 elif 블록의 조건을 만족해서 "100.0"의 길이인 5를 리턴하고 나머지는 해당 사항 없어서 else구문을 수행해서 각 20을 리턴
5+20+20 은 45다. 여기서 중요한 것은 100.0의 길이 셀 때 점까지 세어야 한다는것
그리고 이 문제 풀면서 궁금했던 거는 (100.0, 200.0)는 타입이 뭐지??
type(튜플명) 하면 자료형이 뭐가 되는지 궁금하다
def func(value): if type(value) == type(100): return value+1 elif type(value) == type(""): return len(value) else: return 20 a = "100.0" b = 100 c = (100.0, 200.0) print(func(a) + func(b) + func(c))
문제5
자바의 상속과 메서드 오버라이딩(재정의 문제)
- 자바에서 Derived 클래서가 Base 클래스를 상속 받음
- 이 때 둘다 이름이 같은 정수형 변수 x를 가짐
- 메서드가 오버라이딩 된 경우 동일한 이름의 메서드 중 하위클래스의 연산을 수행해야 함
public class Base{ int x = 3; int getX(){ return x * 2; } } public class Derived extends Base{ int x = 7; @Override int getX(){ return x * 3; } } main() { Base a = new Derived(); Derived b = new Derived(); System.out.print(a.getX()+a.x+b.getX()+b.x); }
예상답안 : 52
풀이 :
메인 영역에서 시작
Base 타입의 인스턴스 a - 아버지가 날 낳은 형태
Derived 타입의 인스턴스 b - 자식이 자식을 낳은 형태
a 에는 Base.a = 3, Derived.a = 7 들어가 있는 상태
b 에도 Base.a = 3, Derived.a = 7 들어가 있는 상태
a.getX() 오버라이딩 했으므로 아들의 getX() 수행해서 7*3=21 가져옴
a.x 아버지의 x인 3 가져옴
b.getX() 오버라이딩 했음으로 아들의 getX() 수행해서 7*3=21 가져옴
b.x 아들의 x값인 7 가져옴
21+3+7+21 = 52
자바 다형성 개념 때문에 메서드 호출 시 객체의 실제 타입(여기서는 deprived)에 따라 오버라이딩 된 메서드가 호출 된다.
a의 타입은 Base 이지만 실제 객체는 derived로 생성자 태웠기 때문에 derived 클래스에서 오버라이딩 된 getX()가 호출됨
그리고 그 안에서 사용되는 x 또한 해당 연산이 이루어지는 공간인 derived 의 x값을 말한다
문제 6
C언어 구조체와 포인터 문제
이번에 출제된 문제 중 가장 긴 문제이다. 손으로 써 가면서 값만 잘 따라가면 무리없이 풀 수 있는 쉬운 문제이다.
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) { print(current->value); current = current->next; } }
예상 답안 : 312
main 영역에서 3개의 구조체 생성
정수형 변수 Value와 포인터 next를 값으로 가짐
주소값(가정) | Value | *next | |
100 | n1 | 1 | NULL |
200 | n2 | 2 | NULL |
300 | n3 | 3 | NULL |
n1의 next에 n3의 주소값 넣기
n3의 next에 n2의 주소값 넣기
그럼 아래와 같은 모습이 된다
주소값(가정) | Value | *next | |
100 | n1 | 1 | 300 |
200 | n2 | 2 | NULL |
300 | n3 | 3 | 200 |
이 때 n1을 매개변수로 func()를 호출하는데
노드가 null값이 아니고 노드의 next값이 null값이 아닌 동안은
int t 에 n1의 value 값을 넣어 주고, n1의 value 값 자리에는 해당 next가 가리키는 공간의 value값을 swap 하게 된다.
n1의 next는 300번지를 가리키므로 n3에 value 인 3과 n1 의 1이 자리바꿈 한다.
이후 수행된 node = node->next->next구문은 결국 null값을 가리키므로 여기서 연산은 종료된다.
node의 next는 300번지를 가지므로 n3를 가리키고 n3의 next는 200번지를 참조하므로 결국 200번지 의
NEXT가 NULL이라 while문이 종료되는 것
최종적인 구조체의 모습은 아래와 같다
주소값(가정) | Value | *next | |
100 | n1 | 3 | 300 |
200 | n2 | 2 | NULL |
300 | n3 | 1 | 200 |
그리고 current 라는 노트 타입의 포인터 변수를 선언해 주는데
그 값은 n1의 주소값을 참조하고 있다. 그러므로 current는 결국 n1과 같은공간을 가리키는 셈이다
current가 null 값이 아닌 동안 current의 value를 먼저 출력하고 나서 current의 next가 가리키는 이동한다
처음에는 n1이 가진 3 출력 후, 300번지로 가서 n3의 1을 출력, 그리고 n3의 next가 가리키는 200번지의 2를 출력한다
200번지에는 next 값이 NULL 이므로 프로그램이 종료 된다.
문제 7
예외처리 문제
- func() 함수 호출하면 NullPointerException 강제로 발생시킴
- NullPointerException e 블록에서 예외를 잡아 주면 Exception e 블럭은 수행 안 함
- finally 구문은 무조건 수행된다.
public class ExceptionHandling { public static void main(String[] args) { int sum = 0; try { func(); } catch (NullPointerException e) { sum = sum + 1; } catch (Exception e) { sum = sum + 10; } finally { sum = sum + 100 } System.out.print(sum) } static void func() throws Exception { throws new NullPointerException(); } }
예상 답안 : 101
왜? NullPointerException 이 있는 catch 블록 수행 후 finally 블록 수행하기 때문
포인터와 배열 문제,
제네릭 기법은 피곤해서 다음에 포스팅....ㅋㅋㅋㅋㅋㅋ
'Diary' 카테고리의 다른 글
✨리눅스마스터 2급 취득 후기 (시험 방식, 공부 방법, 난이도 등)✨ (5) | 2024.10.25 |
---|---|
우울할 때 보는 영상 ㅋㅋㅋㅋ (나만 볼꺼니까 클릭 노) (1) | 2024.10.24 |
빨리 눈 왔으면 좋겠다 (0) | 2024.10.17 |
24/04/06 오늘의 하루 : 새봄맞이 식물 심기 (0) | 2024.04.06 |
24/04/05 오늘의 일기 (0) | 2024.04.05 |