[Study] 알고리즘 문제풀이

14500-테트로미노 #Segmentation Fault #Static

미런던 2017. 4. 18. 12:19

삼성 sw역량테스트에 나온 문제이다. '쉽게 생각하면 쉽게 풀린다'는 말을 되뇌이며 들어갔는데, 정작 제일 복잡한 코드를 짜서 Segmentation Fault를 냈다...ㅠ

복잡한 코드를 짜면 디버깅에 걸리는 시간이 너무 길어진다. 알아보기 쉬운 숏코딩을 하자.


Segmentation Fault

"동적 메모리, 배열, 변수 쓸 떄 초기화를 잘못하면 세그폴트 나는 경우가 종종 있어요"


메모리 구성도

--Data영역

---heap영역 :Dynamic 변수들이 저장

---stack영역 : Auto 변수들이 저장 (자동으로 초기화 되지 않음)

---static영역 : Global, Static 지역/ Static Global 변수 저장(자동으로 초기화 됨)

--Code영역


static 이란?

1. 일반 함수나 Scope에서 :: 해당 Scope 안에서만 유효, 나중에 다시 실행 했을 때 같은 값을 가진다. 0으로 자동 초기화됨.

int Accumulate(int i){

static int acc = 3; //한번만 초기화된다.

acc += i;

return acc;

}

2. 전역에서 :: 해당 파일 안에서만 유효한 전역변수.

static int map[100][100]; 

"전역변수를 선언하고, 그 파일 내에서만 사용하고 싶을 때 사용"

3. Class에서 :: 변수, 함수. 여러개의 Instance들이 공유한다. 특히 static변수는 main 바깥에서 재선언 해주어야 함.

class Accumulator{

static int acc;

int i, j;

}

int A::acc;


Class 내의 static 변수

Class 선언 밑에서 재선언 해주어야 한다. 

int ROBOT::N_Board;

그렇지 않으면 ...

LNK2001 "public: static int ROBOT::N_Board" (?N_Board@ROBOT@@2HA) 외부 기호를 확인할 수 없습니다.


Function 내의 static 변수

일반 Global 변수와 거의 같다.

그러나 Global의 main에서 해당 static 변수에 접근하지 못한다. 즉 '결합도'가 낮다. 결합도가 낮아야 '좋은 코드'이다.

"전역변수를 선언하고, 그 함수 내에서만 사용하고 싶을 때 사용"

int Construct(int i, int j, int before, int count, int N, int M) {

if (count > 4) { 

return Map[i][j];

}

int submax = 0;


static int di[4] = { -1, 0, 1, 0 };

static int dj[4] = { 0, 1, 0, -1 };

for (int k = 0; k < 4; k++) {

if (k == (before+2)%4) {

continue;

}

int iNew = i + di[k];

int jNew = j + dj[k];

if ((iNew >= 0) && (iNew < N) && (jNew >= 0) && (jNew < M)) {

int sub = Construct(iNew, jNew, k, count +1, N, M);

if (submax < sub) submax = sub;

}

}


return Map[i][j] + submax;

}


Global matrix와 dfs/bfs

visit 값 세팅-> dfs recursion 함수실행 -> visit 값 리셋