0x02강-기초 코드 작성 요령2

int , int 배열, 구조체 인자를 함수로 넘길때 어떻게 될까

 

int를 함수 인자로 보내면 값이 복사돼서 넘어간다. 

 

두번째는 arr[0]이 바뀌게 되는데, func에 int배열 arr를 인자로 주는게 arr의 주소를 넘겨주는 것이다. 

그렇기 떄문에 arr[0]을 함수에서 바꾸면 원본의 값도 바뀌게 된다. 

 

구조체의 경우도 int와 마찬가지로 복사본을 주기 때문에 func 함수에서 값을 바꿔도 원본에는 영향을 주지 않는다. 

 

 

 

C까지는 포인터, 2번 사진

c++에서는 한가지 방법이 더, 바로 참조자 // 3번째 사진 

3번째 사진에서 a와 b는 int 레퍼런스 인것이다. 

세번째 사진처럼 레퍼런스를 이용하면 저게 다 원본을 바꾸는 것이다. 

 

참조자는 c에서의 포인터랑 거의 비슷한 기능을 하지만 포인터에서 null pointer에 값을 넣는다거나

type이 다른걸 마음대로 캐스팅한다거나 하는 문제들을 덜 할 수 있게 해주는 패러다임

 

https://bloodstrawberry.tistory.com/271

 

C++ 포인터와 참조자 (pointer vs reference)

C, C++ 전체 링크 포인터와 참조자 모두 call by reference로 함수 내에서 변수의 값을 변경할 수 있다. 포인터는 선언 시에 주소를 할당할 필요가 없고, 나중에 다른 주소를 할당할 수 있지만, 참조자

bloodstrawberry.tistory.com

 

이 게시글이 참조자와 포인터의 차이점에 대해서 기록해 놓은 글인데, 참고해볼만 하다. 

그 중에서 눈에 띄는 부분은

이런 내용들이고, 그중에서도 

포인터는 변수를 바꾸기 위해 *연산자를 이용하지만,

참조자는 이름만 바뀌었으므로 그대로 변경하면 된다. 

라는 부분에서 포인터는 지속적으로 함수 내부에서 *를 붙여서 사용해주어야 하는데, 

참조자는 함수 내부에서 그대로 & 없이 사용하는 부분을 설명하는 것이라는 것으로 보여진다. 

바로 이 두 함수에서 차이점을 확인할 수 있다. 

 

 

STL(standard template library) - vector

https://dev-record.tistory.com/26

 

Vector - Array와의 차이점과 쓰임새

최근 STL을 공부하며 알고리즘 문제풀이 시에 Vector를 유용하게 사용하고 있다. Vector는 임의 접근 반복자를 지원하는 배열 기반의 컨테이너이다. 하지만 앞으로 Array와 Vector에 대해서 명확히 구분

dev-record.tistory.com

 

array와 vector의 차이점에 대해서 검색했을때 보게된 내용. 

동적으로 크기가 변한다는것이 차이점인것 같은데

여기서 vector와 list의 차이점은 뭘까 싶어서 검색했을때 나온 내용도 첨부해보면, 

 

https://chanheess.tistory.com/154

 

vector와 list의 차이점

vector 연속적인 메모리. 미래에 들어갈 요소를 위해 선할당을 한다 각 요소는 요소 타입 그자체만큼의 공간을 요구한다 (포인터들을 포함하지 않는다). 당신이 요소를 추가하는 어느 때나, 전체 v

chanheess.tistory.com

 

리스트와 벡터의 차이를 따지자면 벡터의 경우 연속적인 메모리할당, 리스트의 경우는 비연속적인 메모리의 할당이 큰 차이로 보여진다. 아무래도 비연속적인 메모리 배치를 활용하는 list의 경우는 인자의 삽입 삭제가 용이할것이다. 

 

vector의 경우 새롭게 요소를 추가하면 전체를 메모리에 재할당한다고 하는것 같은데, 

vector와 list의 차이점

 

vector을 선언할때의 방법

 

위의 예시를 보면  vector를 선언할때는 array를 선언할때처럼 arr[100]처럼 대괄호를 사용하는것이 아니라

vector<int> v(100); 처럼 소괄호로 선언한다. 

 

 

<STL을 함수 인자로 넘길때 주의해야할 사항>

 

STL을 함수 인자로 넘길때 주의하도록 하자.

 

STL도 구조체를 인자로 넘길때 복사본을 넘기듯이 함수에 복사본을 넘겨주기 때문에 원본에 영향을 주지 않는다. 

 

주의할 부분 STL을 쌩으로 함수 인자에 넣으면 복사해서 보낸다

 

cmp1과 cmp2의 시간 복잡도 차이

 

cmp1의 경우 stl을 복사하기 때문에 시간복잡도가 하나의 원소를 비교하는 경우더라도 복사하는데 발생하는

시간을 고려해야해서 시간 복잡도는 O(N)이고

cmp2의 경우 cmp2가 호출될때 복사본을 따로 만들어내지 않고 참조 대상의 주소 정보만 넘어가기 때문에 시간 복잡도는 의도한대로 O(1)이 된다. 

 

<scanf와 cin을 활용해서 문자열을 받을때 둘다 공백 앞까지만 입력 받는것을 알고있어야 한다 >

 

hi hello 입력시 공백 앞까지만 입력 받는 모습(scanf와 cin 둘다)

 

해결책으로는 3가지가 있다. 

공백이 있는 문자열을 받는 3가지 방법

 

첫번째는 c언어에서 공백이 있는 부분까지 받는다는걸 표현하는 방법, 

두번째는 gets함수를 사용하는 방법- 하지만 보안상의 이유로 c++14 이상에서는 제거되었다

세번째 getline 함수를 사용한다

이게 가장 좋은 방법이 될 것이다. 이 방법을 이해하고 이 방법을 사용하여 공백이 있는 문자열을 받도록 하자. 

 

공백이 있는 문자열을 받아야 할때는? 

getline 함수를 사용하여서 받도록 하자. 

 

string s;

getline(cin,s);

cout<<s;

 

https://velog.io/@jxlhe46/C-getline-%ED%95%A8%EC%88%98

 

[C++] cin, getline 함수로 입력 받기

공백을 포함한 문자열 입력 받기

velog.io

 

이 부분을 참고하여서 공부하여보자. 

이 게시글에서 말하는 cin의 유의해야할 사항으로는

cin 유의해야할 화이트 스페이스 문자

 

 

----------

*********

scanf/printf와 다르게 cin/cout은 입출력으로 인한 시간 초과를 막기 위해서 

ios::sync_with_stdio(0);

cin.tie(0); 라는 두 명령어를 실행시켜야 한다. 

이걸 안해두면 입/출력의 양이 많을때 시간초과가 날 수 있다. 

 

 

c++ stream과 c stream이 기본적으로 동기화 되어있는데, 내가 c++ stream만 쓸거면 굳이 두 stream을 동기화 할 필요가 없다.

 

대신 동기화를 풀었으면 ios::sync_with_stdio(0); 를 해주었다면 절대 printf와 cout을 섞어쓰면 안된다. 

ios::sync_with_stdio(0);을 해준뒤 printf와 cout을 섞어썼을씨 출력 결과가 꼬인다

 

지금까지 visual studio 2019를 사용해오고 있었는데 그냥 생각 안하고 ios::sync_with_stdio(0)을 사용해서 작성해왔는데 영향을 미치지 않는 상태였구나. 하지만 내가 응시하게 될 코딩테스트의 시험에서  채점서버는 gcc를 사용할것이기 때문에 차이를 발생시킬 것이다. 그러니 습관적으로 ios::sync_with_stdio(0); 을 사용하여서 답을 작성하도록 하자. 동기화를 끊는 것이라는것도 기억하자. 

 

 

 

입력도 버퍼가 있어서 그걸 어느정도 모았다가 넘겨준다. 

 

코딩테스트와 개발은 다르다. 

 

강사의 경우는 이것보다 더 줄여서 이런식으로 작성하겠다고 한다. 

 

출력 맨 마지막에 공백 혹은 줄바꿈이 추가로 있어도 상관이 없다.

 

줄바꿈 또한 출력 맨 마지막에 추가로 있어도 정답 처리가 된다. 

그래서 이부분을 별도로 예외처리를 할 필요가 없다. 

 

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

0x06강 큐  (0) 2023.02.02
0x05강 스택  (0) 2023.02.01
0x04강-연결리스트  (0) 2023.01.28
0x03강 - 배열  (0) 2023.01.26
0x01강-기초 코드 작성 요령 1  (0) 2023.01.25
  Comments,     Trackbacks