목록Algorithm & Test (31)
Priceless

이 문제 같은 경우 단순히 합산 점수가 높아서 풀 수 있는 문제가 아니였다 테스트 케이스, 지원자 수, 지원자의 서류 순위와 면접 순위가 입력된다 C++로 풀 경우 stl의 pair를 활용하면 쉽게 풀 수 있는 문제 배열 두 개를 사용할 경우 한 배열을 나머지 배열을 같은 순서로 정렬해야 하지만 pair로 두 값을 하나로 저장하면서 원활하게 구현할 수 있었다 우선 서류 순위를 정렬한다 서류 순위는 비교할 필요가 없으므로 순차적으로 면접 순위를 비교하여 다른 면접자들의 점수보다 높을 때 count를 늘리고 최고 값을 갱신한다 // baekjoon 1946 #include #include #include using namespace std; // codes for fast I/O void init(){ ci..

그리디 알고리즘 문제는 코드 자체가 길진 않았다 다만 어떻게 구현해서 정확한 값을 도출할 지가 관건이다 DFS, BFS 에 대한 스터디를 진행하지 않아 조금 찾아보고 풀어 본 문제 두 수를 입력 받고 n을 m으로 바꾸기 위해 가능한 연산은 두 가지 2를 곱하거나 ,1을 수의 가장 오른 쪽에 추가한다 이 말은 즉 곱하기 10 더하기 1이다 처음에는 n을 m으로 바꿀 방법을 모색하다가 경우의 수를 둬서 풀었을 때 while 문 두 번에 시간 초과가 뜰 것 같아 m에서 n을 접근하는 방법으로 변경했다 위 두 가지 연산을 반대로 하면 2를 나누거나, 10을 나누는 것이다 10을 먼저 나누는 것이 변경 횟수가 줄어드므로 10을 먼저 나눈 후, 2를 나눌 수 있는지 여부를 확인한다 만약 두 수로 나눌 수 없거나 애..

체스에서 나이트의 움직임을 오른쪽으로만 움직였을 때 입력 받은 체스판에서 최대한의 이동하는 칸의 수를 구하는 문제다 체스판이 작을 때 이동 횟수에 대한 제한 있기 때문에 그 부분에 대해서 하나씩 조건을 걸어야 한다 체스판이 커지면 최대로 갈 수 있는 칸을 세기 위해 계산한다 자세한 계산 수는 코드를 참고한다 // baekjoon 1783 #include #include #include using namespace std; // codes for fast I/O void init(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); } int main(){ init(); int n, m; cin >> n >> m; if(n == 1){ cout

특별한 예외 처리가 필요할 줄 알았지만 생각보다 너무 쉬워서 빨리 해결할 수 있었다 개수가 적은 수를 바꿔야 하므로 값이 바뀌는 횟수를 세고 난 후 절반을 나누면 된다 // baekjoon 1439 #include #include #include using namespace std; // codes for fast I/O void init(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); } int main(){ init(); string input; cin >> input; int temp = input[0]; int n = input.length(); int switching = 0; for(int i = 1; i < n; i++){ if ..

그리디 알고리즘으로 푸는 문제 그리디 알고리즘으로 발제를 진행한 후, 원리나 작동 방식은 이해했지만 정작 코딩 경험이 부족했다 이해한 부분을 코드로 풀어쓰는 게 쉽지 않아 쉬운 문제부터 차근차근 풀어보기로 했다 0을 입력 받기 전까지 수 3개를 입력 받는다 최대 기간(p) 중 연속으로 사용 가능한 날짜(l)을 입력 받고 전체 휴가 기간(v)을 입력 받는다 우선 전체 휴가 기간 중 최대 기간만큼 나눈 몫만큼은 사용 가능한 것이 보장되어 있으니 나눈 몫에 연속으로 사용가능한 날짜를 곱해 사용 가능한 날짜를 저장한다 그 다음 몫으로 나눈 나머지에 대해 연속으로 사용 가능한 날짜보다 큰 경우 최대로 연속으로 사용 가능한 날짜를 더하고 연속으로 사용 가능한 날짜보다 작은 경우 남은 날짜만큼 더하서 완성한다 // ..

string과 char를 잘 이용하면 되는 문제 string으로 입력을 받은 뒤 정렬 과정을 거쳐 하나씩 출력하면 된다 숫자를 입력 받아 자릿수마다 나누는 방식으로 접근할 수도 있지만 확실히 자릿수를 나눠서 하는 문제는 문자열로 해결하는 것이 더욱 수월하고 빠르게 해결할 수 있는 방법인 듯하다 // baekjoon 1427 #include #include #include using namespace std; // codes for fast I/O void init(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); } int main(){ init(); string input; cin >> input; unsigned long len = inpu..

1부터 9까지 111~999를 범위로 하여 (0 제외) 반복문을 진행하였으며, 처음에는 111~999 를 가진 배열을 통해 후보가 아닌 숫자를 제거하여 시도 하였다 하지만 과도한 반복문 사용으로 시간 초과가 우려되었다 또한 스트라이크와 볼에 대한 접근이 어려워 다른 방법을 참고하였다 처음에는 문제 자체를 이해하기 어려웠다 맞히는 사람의 입장에서만 생각해서 하다보니 너무 어렵게 접근했는데 숫자 야구 문제를 내는 사람에서 생각하면 조금 더 쉽게 접근할 수 있는 문제였다 아래는 기존에 배열로 접근했던 코드이다 9 x 9 x 9 의 경우에서 가능하지 않은 경우를 모두 제거하려고 했다 처음 시도 int n; cin >> n; int arr[729]; // 가능한 모든 수 int index = 0; for(int ..

이분 탐색을 사용하는 문제로, 기존의 나무 자르기 문제와 비슷한 유형이다 최대 길이를 가진 랜선을 구한 후, 최대 길이의 랜선의 길이에서 이진 탐색을 수행한다 랜선들을 자른 몫을 합 한 후, 몫이 입력 값 이상이 나타나는 최대 길이를 구할 수 있다. 처음에는 최대 길이를 구하기 때문에 long long cut 변수를 사용하지 않고 바로 int mid를 출력했지만 오류가 나타났다 아래 사이트에서 별도로 새로운 변수를 사용하여 출력하는 것을 참고하였다 [C/C++] 백준 1654번 - 랜선 자르기 :: 코딩 공부 일지 (tistory.com) [C/C++] 백준 1654번 - 랜선 자르기 문제 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하..

[백준] 2108번: 통계학 (C++) 1트 (tistory.com) [백준] 2108번: 통계학 (C++) 1트 숫자를 입력 받아 산술 평균 중앙값 두 번째 최빈값 범위 4가지 통계 값을 구하는 문제이다 산술 평균은 반올림을 고려하여 진행하면 된다 중앙값 과 범위는 인덱스를 활용한다 최빈값은 기존에 priceless-hyun.tistory.com 최빈값 문제를 해결하기 못해 해결하지 못했던 문제 최빈값을 구하는 과정에서 새롭게 생각해야 할 부분이 있었다 새로운 해결법을 찾기 위해 찾아보던 중 다른 사이트에서는 최대 입력 값이 4000인 것을 고려하여 8000 크기를 가진 배열을 사용하였는데 그 부분이 이해가 가지 않아 다른 풀이를 찾던 중 아래의 사이트를 참고하였다 백준 2108 통계학 c++ [컴공과..

숫자를 입력 받아 산술 평균 중앙값 두 번째 최빈값 범위 4가지 통계 값을 구하는 문제이다 산술 평균은 반올림을 고려하여 진행하면 된다 중앙값 과 범위는 인덱스를 활용한다 최빈값은 기존에 알고 있는 정보로는 부족했다 두 번째 최빈값을 구하기 위해 첫 번째 최빈값과 두 번째 최빈값을 저장하는 방식으로 접근 했으나 쉽지 않았다 아래 방법과 같이 구현했지만 최빈값 갱신 과정에서 문제가 발생한 것인가 오답이 나타났다 두 최빈 값을 인덱스 값도 추가하여 구현했지만 별다른 방법이 나타나지 않았다 int count = 1; int first_max_same = 1; int second_max_same = 0; int temp = 0; //int index = 0; for(int i = 0; i < n; i++){ m..