백준: Silver5② - 1064, 1094, 1158
</br>
풀다 보니까 실버 4로 올랐다.
일단 이미 푼 실버 5는 이까지~~
</br>
1064: 평행사변형
https://www.acmicpc.net/problem/1064
세 개의 점을 입력 받고 만들어질 수 있는 평행사변형들의 가장 긴 둘레와 짧은 둘레의 차 구하기
double d1 = dist(x1,y1, x2,y2);
double d2 = dist(x2,y2, x3,y3);
double d3 = dist(x3,y3, x1,y1);
vector<double> v;
v.push_back( (d1+d2) * 2.0 );
v.push_back( (d2+d3) * 2.0 );
v.push_back( (d3+d1) * 2.0 );
sort(v.begin(), v.end());
cout << v[2] - v[0] << endl;
처음 봤을 땐 점을 구해야 하나? 갑자기 실버 5가 왤케 어려워 했는데
좀 더 보니까 둘레 얘기 밖에 없으니 점을 구할 필요가 없다.
평행사변형은 어차피 두 변이 같은데 점 3개를 가지고 보면 다른 변 길이가 3개 구해진다.
이 다른 변 3개끼리 또 조합한 3가지 둘레 길이를 벡터에 넣고 정렬 후 가장 큰 둘레와 작은 둘레의 차를 프린트한다.
그림 그려 보면 바로 앎ㅎㅎ
</br>
1094: 막대기
https://www.acmicpc.net/problem/1094
설명이 긴데
결국 그냥 23 = 16 + 4 + 2 + 1 같은 말
int m = 64, cnt = 0;
while( n ){
if( m > n ){
m /= 2;
}
else if( m <= n ){
cnt++;
n -= m;
}
}
64에서부터 2로 나눠 가며 채우면 그냥 된다.
</br>
1158: 요세푸스 문제
https://www.acmicpc.net/problem/1158
요세푸스 순열 구하기.
원탁에 앉은 사람들이 있고, k번째 사람을 계속 제거한다.
vector<int> v;
for(int i = 1; i < n+1; i++){
v.push_back(i);
}
queue<int> q;
int i = 0, j = 0;
while( v.size() ){
if( j == k-1 ){
q.push(v[i]);
v.erase(v.begin() + i);
j = 0;
}
else{
i++;
i %= v.size();
j++;
}
}
cout << '<';
while( q.size() != 1 ){
cout << q.front() << ", ";
q.pop();
}
cout << q.front() << ">\n";
출력 방식이 좀 특이해서 편하게 큐에 저장해뒀다가 출력했다.
벡터를 원탁이라고 보고, 원탁에 사람이 없을 때까지 없앤다.
i는 인덱스, j는 k번째인지를 센다. 원탁처럼 봐야 하므로 i는 모듈러 연산을 해 준다.
</br>
다음엔 실버 4 문제들~~
</br>
댓글남기기