본문 바로가기

알고리즘

삼성전자 certi B형(PRO) 팁

Struct 배열

 배열 내부의 struct 를  변경하고 싶으면 포인터로 접근해야한다.

 

문자열 \n 을 기준으로 나누고, 

매번 접근하기 어려우니 Edit 에서 만 접근해놓는다. 

문자열은 실제로 중요한가? 아니다. 변경되었는지만 중요하다.

for(auto it = arr.begin(); it!=arr.end(); it++);

 

[메모리풀]

메모리를 malloc 하지말고 풀을이용해라. 훨씬 편하다.

전역변수로 몇십만개 만들어두고, poolcnt =0 를 사용해라.

사용한 후에 재초기화도 필요없다. 단지 poolcnt =0 으로 두면 된다.

우리는 어차피 poolcnt++하기전에 해당 주소의 값을 변환하고 사용할 것이기 떄문이다.

-  <stdio.h> <iostream> <malloc.h>만 사용가능

https://www.acmicpc.net/problem/2606 문제를

https://bloodstrawberry.tistory.com/29 로 풀어보자.

 

 

[IfElse / Switch Case]

switch 가 더빠르다.

 

[For문 밖에서 변수 선언]

- 안정적인 scanf, printf 권장

 

[비트]

 -나눗셈은 느리다. 곱셈으로 대체 가능한지 봐라

 -%연산보다  &1로  홀수인지 볼 수 있다. 

 -제곱수로 나누기  > 시프트로 가능

 

 

[register 변수 사용]

for 문 안에 있는 변수에 register를 사용해보자.

메모리 대신 CPU의 레지스터를 사용하기 때뭉네

for(register int i  =0 ; i < 10000000; i++){

  매우 빨라진다.

}

 

[입출력]

scanf  prinf 써라.

 

 

 

 

[트리는 이차원배열로 만들기]   > 포인터로도 만들지 마라 ! 그냥 이차원 배열 ㄱㄱ

 케이스1  data를 인덱스로 사용가능한 경우 int일때:

    [v]  LR
  케이스2 : data를 인덱스로 사용 불가능 한경우

    VLR  연결리스트에서 했던것들을 그대로 이차원배열로 만든것이다. 데이터가 들어오는 대로 메모리에 차례대로 적재하면서 메모리 상에서 링크를 재조정하면서 트리를 완성

 tip )  "root를 1 , 1부터 N까지 주어진다."   > 1부터 누락없이

         "V는  최대  N 까지"   >  1부터 누락이 있을 수 있다.   >> optional TF 를 만들어서 데이터가 들어온것만 처리한다. ( like visit배열이 두개의 표현은 다르다.

 

 부모 정보를 구축하는것 추천!!!! root노드는부모가  0   즉 데이터 구조가 L eft Data  PARENT Right

 

[완전이진트리면] 

  일차원 배열로 가능

  자식은 2i 2i+1 이다. > 이걸로 자식이 있는지 확인 할 수 있다.

 

  

[전역변수]
레지서터 사용 필요까진 없다.
전역변수를 계속 접근해야한다면, 잠시 스택(로컬)에 넣어둔후에  사용끝난후 다시 갱신해준다.
0으로 초기화되서 bool 은 false


[함수 인수]
인수로 넘길때 인수가 많으면 struct로 넘기고, 
수정되면 안된다면 const 를 붙여서 한다.

[포이넡]
포인터 체인*?은 피해야한다.

[스위치 대신 look up table 을 사용해라]
좌측의 것을 우측으로 치환해라.

[count down to zero 가 더빠르다 ( ==0 은 회로가 있기 떄문)


[함수호출 여러번]
호출을 여러번 하게 하지말고 
함수안에 for 문을 넣어봐라.

 

[이진탐색트리 - 재귀]

작은값중에 가장 작은값 , 큰값중에 가장 작은값

int tree[MAX] = {0,} >> 일차원배열에  저장, 왼쪽오른쪽은 다로 저장하지 않는다.

>> 배열처음에 값 하나 넣어줘라. 뒤에서 따로 인덱스값 처리 안해줘도 될테니

 

[for문 변수는 밖에다 선언하고 안에서 쓰기]

 

[전역변수 접근은 성능저하]

전역변수는 data 영역에 생기기떄문에 접근할때 마다 비용이든다.

전역변수를 쓸떄마다 

stack  영역에 할당하고  다쓴후 전역변수를 갱신해주는 것이 좋다. 

 

[입력과 출력]

입력과 출력이 느리다.

개별글자 하나하나 보단 문자열 단위로 핸들링하는게 더빠르다. ( 따라서 문자 한개씩 다 출력하기보단

결합해서 한개의 출력에 빵 출력 떄려버리는게 낫다.)

- 구조체 및 포인터 이해 (ex. 포인터 배열로 대상 접근)

- 정적 배열 사용시 Runtime Error 방지를 위해서 여유롭게 크기 설정

- 배열 시작 Index는 상황에 따라 『 0 』 /  『 1 』 선택  //문제 보고 결정

- 매크로 함수보다는 inline 키워드 권장 ???????

  ex)  inline int max(int A, int B) { return A > B ? A : B; }

- 기출 유형 많이 풀어보기 (main.cpp + user.cpp 구조로 된 API형 문제)

  : 문제 설명과 함께 main.cpp에서 함수 호출 횟수, 변수 조건 파악

- SWEA Reference Code 활용 (실제 시험에서도 주어짐)

    ex) Heap, djb2, Quick Sort

- 첫번째 Test Case는 통과 후 2번째 Test Case부터 틀리는 경우는 초기화 init() 부분 의심

    ex) 두번째 TC만 실행해보면서 확인

 

[구조체와 클래스의 차이점]

접근 범위가 다르다. (구조체는 public , 클래스는 기본적으로 private ) 

구조체는 동일 타입에 대해서  대입연산 가능 

클래스는 생성자, 대입연산자 함수를 생성해서 써야한다.

 

[한글자 비교일떄는] 

 ' ' 를 써라. " " 보다 더 빠르다.

공부해볼 만한 키워드

Array, Linked List, Bitwise 연산, Greedy, 완전탐색(Brute-Force), BFS, DFS, DP, 분할정복, Sort, Binary Search, Graph, Dijkstra, Tree, LCA, Heap, Trie, KMP, Hash

출처 : https://zoosso.tistory.com/335

https://blog.uniony.me/study/samsungb/

 

삼성전자 SW 역량테스트 B형 후기 1 (준비)

삼성전자 S/W 알고리즘 특강을 수강하여 운좋게 삼성전자 SW 알고리즘 역량테스트 B형(pro) 을 치를 기회를 얻었습니다. 2회의 기회가 주어졌고 저는 두번째 테스트에서 통과하여 B형을 취득하였습

blog.uniony.me

 

[큐 구현]

front , rear =0 

rear 는 데이터가 곧 들어갈곳 ( 비어있음 ) 

front 는 첫 데이터 위치

rear == front면 데이터가 없다는 것이다.

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

스택 구현  (0) 2022.10.30
14600. [Pro] 성적 데이터베이스  (0) 2022.10.29
비트연산 / 비트마스킹  (0) 2022.10.27
재귀함수에 대한 분석!  (0) 2022.05.09
순열과 조합 직접 개발하기 with yield 간단방법  (0) 2022.04.30