7.2주차
실습 19
입력받은 각도에 따라서 예각이면 1, 90도이면 2, 90~180사이면 3, 180도이면 4를 출력하는 문제
내가 제출한 코드
#include <string>
#include <vector>
using namespace std;
int solution(int angle) {
int answer = 0;
if (angle > 0 && angle < 90)
answer = 1;
else if(angle == 90)
answer = 2;
else if (angle > 90 && angle < 180)
answer = 3;
else if (angle == 180)
answer = 4;
return answer;
}
실습 20
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
0 < array의 길이 < 100
0 ≤ array의 원소 < 1000
입출력 예
array | result |
---|---|
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
교수님 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> array)
{
int answer = 0;
int count[1000];
int mode;
int modeCount = -1;
bool duplicate = false;
// 0으로 초기화
for (int i = 0; i < 1000; i++)
count[i] = 0;
// array에 있는 숫자를 인덱스로 간주하여 그 숫자가 나올때마다 ++을 하는 형식
for (int i = 0; i < array.size(); i++)
count[array[i]]++;
for (int i = 0; i < 1000; i++)
{
// max 구하기
if (count[i] > modeCount)
{
mode = i;
modeCount = count[i];
duplicate = false; // 동점자인지 아닌지
}
else if (count[i] == modeCount)
{
duplicate = true;
}
}
if (!duplicate)
answer = mode;
else
answer = -1;
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> array)
{
int answer = 0;
int mode;
int modeCount = -1;
bool duplicate = false;
// 맨 첫 번째 숫자(i)가 몇 번 등장했는지를 센다.
for (int i = 0; i < array.size(); i++)
{
int count = 0;
for (int j = i; j < array.size(); j++)
{
if (array[i] == array[j])
count++;
}
// max 구하기
if (count > modeCount)
{
mode = array[i];
modeCount = count;
duplicate = false;
}
else if (count == modeCount)
duplicate = true;
}
if (!duplicate)
answer = mode;
else
answer = -1;
return answer;
}
Call by Value VS Call by Ref
Call by Value
- 장점: 안정성
- 단점: value의 경우는 메모리 access가 불가하기 때문에 scanf와 같이 입력 받자마자 값을 바꾸어서 저장해주는 형식은 어렵다. 또는 값을 복하새야 되니까 복사해야되는 개수가 많아지면 시간 손해.
Call by Ref
- 장점: 메모리 access 가능하므로 값을 바로 바꾸는 것이 가능 그리고, 주소 접근이 가능하므로 복사해야될 필요가 없어서 시간 save 가능
- 단점: 안정성
예시
#include <iostream>
using namespace std;
// call by value라는 것
void test1(int a)
{
a++;
}
// & 라는 것은 call by ref라는 것
void test2(int &a)
{
a++;
}
int main()
{
int i = 0;
int j = 0;
test1(i);
test2(j);
cout << "i: " << i << endl; // 0
cout << "j: " << j << endl; // 1
}
출력값이 i = 0, j = 1이 나왔다. 왜냐하면 test1의 i는 0이라는 값을 복사해서 test1에서 사용을 하였기 때문에 main의 i에게는 아무런 영향을 미치지 않는다.
하지만 j의 경우는 j의 주소를 전달하였기 때문에 a는 j와 똑같은 주소를 사용하게 된다. 따라서 test2에서 a++라는 것은 j의 값이 변경되는 효과가 있다.
#include <iostream>
#include <vector>
using namespace std;
// call by value라는 것
void test1(vector<int> a)
{
a.push_back(100);
}
// & 라는 것은 call by ref라는 것
void test2(vector<int> &a)
{
a.push_back(100);
}
int main()
{
vector<int> i;
vector<int> j;
test1(i);
test2(j);
cout << "i.size(): " << i.size() << endl; // 0
cout << "j.size(): " << j.size() << endl; // 1
}
벡터로 예시를 보자면 마찬가지로 test1의 경우는 value를 전달하였기 때문에 test1의 값이 main의 i 벡터에게는 아무런 영향을 미치지 않는다.
하지만 test2의 경우는 j의 주소를 전달하였기 때문에 test2에서 바뀐 값이 당연히 main의 j까지 영향을 미친다.
여기서는 한 개의 값을 넣는 것으로 예시를 들었지만 만약에 i와 j가 모두 1000개의 값을 가지고 있다고 한면! test1을 호출할때는 함수 호출의 시간이 오래걸린다. 1000개의 데이터를 복사해주어야 되기 때문이다.
하지만 test2의 경우는 1000개의 데이터를 복사하지 않아도 되기 때문에 함수 호출이 빠르게 가능하다. 대신 안정성은 떨어진다. 의도치 않은 벡터 j에 대한 변경을 하게 되면 고스란이 j 벡터에 영향을 미친다. 그게 의도한 변경이면 상관이 없지만 의도하지 않은 변화라면 이를 막을 방법은 없다. 따라서 상대적으로 test1(value)이 안정성이 좋다는 것이다.
함수를 호출할 때 전달하는 인자가 주소인지 값인지 알 수는 없다. 선언 부분을 확인해야 확인이 가능하다.
ref의 단점인 안정성을 고칠 수 있는 방법이 한 가지가 있다. 만약에 값은 변경하고 싶지 않은데, 그냥 단순히 함수 호출 시간을 줄이기 위해서 주소를 전달해주는 것이라면 const 를 사용해서 데이터에 대한 변경을 막을 수 있다. 하지만 값을 변경하기 위해서 주소를 사용한 것이라면 그건 그냥 함수가 적절한 기능을 함을 믿고 실행시켜야되는 것,,
에러 찾기?
void f(int a, int &r, const int &cr)
{
++a;
++r;
++cr; // ERROR: const이므로
}
// 값을 수정하지 않는다면 읽기는 상관 ㄴ
void g(int a, int &r, const int &cr)
{
++a;
++r;
int x = cr;
++x; // OK
}
int main()
{
int x = 0;
int y = 0;
int z = 0;
g(x, y, z); // OK(ㄱㄴ)
g(1, 2, 3); // ERROR
// ref는 값을 변경하고자 하여 &를 붙혔으므로 상수를 전달해줄 수는 없다.
g(1, y, 3); // OK
// 하지만 const &는 상수 전달이 가능하다.
}
Guidance for Passing Variables
- Use call-by-value for very small objects
- Use call-by-const-reference for large objects
- Use call-by-reference only when you have to return a result rather than modify an object through a reference argument
namespace
전에 중국성,,,, 얘기해준 것, 그정도면 될듯?
- 언급 X : Full name(std::cout)
- using declaration(using std::cout)이라고 하면
cout << "OK" << "\n"; // OK cin >> x; // ERROR
- using namespace directive: derective 밑에 있는 모든 것에 대해서 줄여쓸 수 있다.
시험 공지
다음주 화요일 시험
시험범위는 여기까지(7.2주차 내용까지)
시험은 종이로 볼 예정이지만 + 대신 노트북도 꼭 챙겨와야 됨
현장만 허용
이정도 난이도거나 이거보다 조금 더 어려운 정도 => 코드만 보는 건가?
목요일 수업,,,,클래스: 중간고사에는 포함되지 않는다.
댓글남기기