알고리즘 그리디 알고리즘 정렬 풀이 나무 중 자라는 길이가 큰 것을 가장 나중에 자르도록 한다. 첫날 나무의 길이에 매일 자라는 길이만큼 더해지므로, 정수 ans 변수에 첫날 나무의 길이를 다 더해둔 후 매일 자라는 길이 * 자르기 전까지 자라난 일 수를 반복문을 통해 더해준다. 매일 자라는 길이는 오름차순 정렬 후 배열의 끝에서부터 사용하였다. 시간 초과 코드 grow 배열을 정렬하지 않고 굳이 max 값을 일일이 구하여 O(n^2) 시간복잡도가 되어 시간초과 발생 #include #include #include using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("input.txt", "..
알고리즘 그리디 알고리즘 풀이 0번째 스위치를 누르는 경우와 0번째 스위치를 누르지 않는 경우를 나누어 생각한다. 1~n-1번째 스위치를 누를지 말지 여부를 결정하기 위해 for문을 돌린다. i번째 스위치를 누를지 말지를 결정하기 위해 i-1번째 전구의 상태와 목표로 하는 i-1번째 전구의 상태를 비교한다. 같으면 누르고 cnt++ 다르면 누르지 않는다. 현재 전구의 상태와 목표로 하는 전구의 상태가 같으면 cnt를 리턴하고 그렇지 않으면 2147000000을 리턴한다. 0번째 스위치를 누르는 경우와 0번째 스위치를 누르지 않는 경우 중 최소값을 골라 출력한다. 만약에 두 경우 모두 답이 나오지 않아 리턴값이 2147000000인 경우 -1을 출력한다. 전체 코드 #include #include usin..
성공 코드(내 코드) people을 오름차순으로 정렬한다. 보트에 최대 2명이 탑승 가능하므로 최솟값 + 최댓값을 더해본다. 더해준 값이 limit을 넘으면 2명 탑승이 안되므로 맨 뒤의 사람은 혼자 타야한다. 한명 밖에 타지 못하면 맨 뒷사람을 가리키는 인덱스를 줄여준다. 더해준 값이 limit을 넘지 않으면 2명 탑승이 가능하다. 즉 맨 앞사람을 가리키는 인덱스를 하나 증가시키고 맨 뒷사람을 가리키는 인덱스를 하나 감소시킨다. 이 과정을 맨 앞사람을 가리키는 인덱스가 맨 뒷사람을 가리키는 인덱스보다 작거나 같은 동안 반복해준다. #include #include #include using namespace std; int solution(vector people, int limit) { int answ..
성공 코드(내 코드) survey를 탐색하며 choices가 3이하인 경우에는 survey의 첫번째 문자에 해당되는 인덱스를 찾아 벡터 st의 원소에 점수를 추가 choices가 5이상인 경우에는 survey의 두번째 문자에 해당되는 인덱스를 찾아 벡터 st의 원소에 점수를 추가 st를 탐색하며 i=0, 2, 4, 6인 경우 st[i]과 st[i+1] 중 큰 값을 가지는 원소가 나타내는 문자를 벡터 type를 통해 찾아 answer에 추가한다. #include #include #include using namespace std; string solution(vector survey, vector choices) { string answer = ""; vector st(8); vector type(8); ..
성공 코드(내 코드) 2차원 벡터 organize에 report의 내용을 정리한다. id_list의 사이즈만큼 n*n 2차원 배열 organize를 생성한다. 각각의 행과 열은 id_list의 인덱스 값에 해당되는 사람을 나타내고 행에 해당되는 사람이 누구를 신고했는지 해당 행의 원소들에 체크를 하게 된다. 0을 1로 바꿈으로써 체크가 이루어진다. 이렇게 함으로써 중복되는 신고는 한번으로 처리 가능하다. organize의 각각의 열을 탐색하며 k번 이상 신고된 자의 인덱스를 stopped 벡터에 추가한다. organize를 행마다 탐색하며 이때 cnt는 0이 된다. stopped가 체크되어 있으면 cnt를 증가시켜 메일을 받은 횟수를 증가시킨다. 그리고 해당 행의 탐색이 끝나면 answer 벡터에 cnt..
성공 코드(내 코드) 마침표가 두개 이상이면 하나로 치환하기 위해 fs 변수 사용 .이 나오면 fs=1로 만들고 다음부터 .이 나오는 경우 fs가 1이면 연속해서 나오는 것이므로 해당 문자를 erase .이 아닌 조건에 만족하는 다른 문자가 나오면 fs=0으로 만든다. 나머지 단계는 흐름에 맞게 if문을 사용 #include #include using namespace std; string solution(string new_id) { string answer = ""; int fs=0; for(int i=0; i=97 && answer[i]=48 && answer[i]=16){ answer.erase(15, answer.size()-1); } if(answer[answer.size()-1]=='.'){..