BOJ - 요세푸스 문제 0 11866
·
코딩테스트
해결방법큐를 활용해야 하는 문제.큐의 구조는 FIFO(First In First Out)구조라는 것을 생각해보면 맨 처음 들어온 것이 맨 위에 있다고, 입력을 받으면 맨 밑으로 들어간다는 것을 알 수 있다.따라서 N개의 수를 1부터 입력하고, 맨 위의 수를 더미로 저장한다음 하나씩 Pop을 하면서 count를 체크하고 K번째가 아니라면 다시 Push해주는 식으로 하면 된다. 정답 코드#include #include using namespace std;int main(){ int N, K, count = 0; cin >> N >> K; queue Q; for (int i = 0; i "; return 0;}
BOJ - 팩토리얼 0의 개수 1676
·
코딩테스트
해결방법의외로 쉬웠던 문제. N팩토리얼을 계산해서 그 수를 뒤에서부터 0이 몇개인지 세는 문제인데, 결국 0이 나오려면 10을 곱해야 한다는 것과 10은 2 * 5라는 것을 이용해서 5의 배수가 몇개 있는지를 세면 되는 문제이다(2의 배수는 너무 많으니까). 정답 코드#include using namespace std;int main(){ int N; int Five, FiveSqrt, FiveSSqurt; cin >> N; Five = N / 5; FiveSqrt = N / 25; FiveSSqurt = N / 125; cout
BOJ solved.ac 18110
·
코딩테스트
해결방법우선 절사평균을 구하기 위해 입력받은 데이터들을 정렬을 해줘야 한다. 여기서는 상하 15퍼를 버리고 남은값들의 평균을 낸다고 했으니 n * 0.15 + 0.5 이런 식으로 15퍼센트를 구하고 0.5를 더해 반올림을 해준다. 그다음 start와 end 변수를 만들어서 절사한 후의 범위를 만들어주고, accumulate와 distance를 이용해 절사평균을 구해준다. 정답 코드#include #include #include #include #include using namespace std;int Tmean(vector& data){ if (data.empty()) { return 0; } sort(data.begin(), data.end()); int n = ..
구조체 패딩
·
Programming/기타
구조체 패딩이란?CPU에서는 데이터를 메모리에서 읽고 쓸 때 정렬되어 있는 경우에 더 빠르게 접근할 수 있다. 예를 들어 32비트 컴퓨터의 경우 4바이트 단위로 저장되어 있어야 더 효율적으로 접근이 가능하다. 만약 4바이트 단위가 아니라 6바이트, 7바이트 등의 형태로 정렬되어 있는 경우 추가적인 연산이 발생하면서 성능이 저하될 수 있다. 예시를 한번 들어보자. struct Pad{ char a; long long b;}; 이 구조체의 멤버 b의 자료형은 long long이기 때문에 8바이트의 크기를 갖는다. 이 변수를 읽어들이는 경우 32비트 OS의 경우 3번의 접근이 필요하고, 64비트 OS의 경우에도 2번의 접근을 필요로 하게 된다. 하지만 패딩을 통해 보정을 해준다면?32비트의 경우 2..
BOJ 숫자의 개수 2 21567
·
코딩테스트
해결방법입력받은 숫자를 문자로 변환하여 문자열의 맨 뒤에서부터 '0'을 빼서 아스키코드를 통한 연산으로 숫자를 받아서 배열의 수를 증가시킨다. (예를 들어 13410의 경우 맨 뒤에서부터 0, 1, 4, 3, 1이 1번씩 증가)원리는 숫자의 아스키 코드값이 연속적이고, 0, 1, 2, 3... 순으로 배치되어 있기 때문에 그 특성을 활용한 것이다. 정답 코드#include #include using namespace std;int main(){ std::cin.tie(NULL); std::ios::sync_with_stdio(false); unsigned long long A, B, C, temp; string num; cin >> A; cin >> B; cin >> C; temp = A * B * C;..
BOJ - 이항 계수 1 11050
·
코딩테스트
해결방법이항계수라는 것은 다음 공식처럼 재귀함수를 이용하여 풀 수 있다. 물론 자리수가 조금만 커지게 된다면 저 방식으로는 제한시간 내에 풀 수 없을 것이다.다음번에 비슷한 문제가 나오게 된다면 새로운 해법을 가져오겠다. 풀이는 재귀함수를 이용하여 계산을 반복했다. 정답 코드#include using namespace std;static int LeeHang(int n, int r){ if (r == 0 || n == r) return 1; return LeeHang(n - 1, r - 1) + LeeHang(n - 1, r);}int main(){ int N, K, Out = 0; cin >> N >> K; Out = LeeHang(N, K); cout