목록💻 현생/⛓ 알고리즘 (223)
궤도
문제 풀이 일단 알파벳의 등장 횟수를 체크해야하니 알파벳의 개수만큼의 크기를 가진 배열(alpha[26])을 만들어준다. 소문자 영어의 아스키코드는 97부터 시작하고 대문자 영어의 아스키코드는 65부터 시작한다. 소문자와 대문자를 구분하지 않으니 대소문자 여부를 판단해 적절히 alpha 배열에 넣어준다. 완성된 alpha 배열을 돌며 최대값을 찾아야 하는데, 그와 동시에 해당 최댓값에 해당하는 알파벳이 2개 이상인지도 체크해야 한다. 이를 위해 bool 변수 flag를 뒀다. 영어 대소문자 문제는 많으니까 각각의 아스키코드를 외워두는게 나쁘진 않을 것 같다. 소스코드 #include #include using namespace std; int main() { int alpha[26], max = 0, m..
문제 풀이 1,000 이하 라고는 하지만 1,000은 한수가 아니다. 그리고 1~99는 무조건 한수다. 그렇다면 세자리 수에 대해서만 한수여부 체크를 하면 된다. 세자리 수를 셋으로 쪼갠다. (part[0], part[1], part[2]) 그리고 (part[0]-part[1])==(part[1]-part[2]) 인지 확인하는데, 이거 말고 등차수열의 성질을 이용해서 2*part[1]==part[0]+part[2] 인지 확인해도 상관없다. 소스코드 #include using namespace std; bool isHan(int n) { int part[3]; if (n < 100) //100미만이면 무조건 한수 return true; else if (n == 1000) //1000은 안됨 return f..
문제 풀이 이 문제를 풀 당시에는 이제 막 c++을 알아가던 단계였다. 그래서 저기 나오는 vector가 무엇인지 검색을 좀 해봐야 했다. 자료구조 할 때 배웠던 linked list와 비슷한 기능을 하는 것 같았는데 이 사실을 알고 너무 억울했다. 난 c로 하나하나 구현하느라 고생했는데 c++엔 이런 좋은게 있었다니! 나중에 알고보니 c++엔 스택, 큐, 덱 등등 내가 c로 개고생하면서 구현했던 모든 것들이 기본으로 있었다고 한다. 뭐 그 때 알고 있었다고 해도 c로 구현할 수 밖에 없었으니 어쩔 순 없지만 계산기의 존재를 모르고 손으로 계산하던 기분이었다. c++도 이렇게 좋은게 많은데 파이썬은 얼마나 더 좋을까? 하지만 파이썬은 너무 심플하게 생겨서 아직까지 낯을 가리고 있다. 소스코드 #inclu..
문제 풀이 뭔가 최댓값을 먼저 구하고 그 값을 기준으로 모든 수를 조작한 뒤 새롭게 평균을 구해야할 것 같은 착각이 드는 문제다. 하지만 사실 그냥 기존 입력의 합을 구한 뒤 (합)/(최댓값)*100/N 해주면 된다. 괜히 어려운척 하는 문제다. 소스코드 #include using namespace std; int main() { int N, max = -1, i; double sum = 0.0; cin >> N; int* score = new int[N]; for (i = 0; i > score[i]; if (score[i] > max) max = score[i]; //최댓값 sum += score[i]; //걍 일일히 안하고 한번에 더해서 나누면 되던디 } cout
문제 풀이 42로 나눈다는 사실이 고정됐기 때문에 쉬운 문제이다. 42로 나눈다면 그 나머지는 0~41일 것이다. 그럼 해당 나머지의 출현 횟수를 세어주는 42 크기의 int 배열을 만들면 된다. 배열을 채운 뒤 한 번 돌아주며 저장된 값이 0이 아닌 인덱스를 체크해주면 된다. 소스코드 #include using namespace std; int main() { int num, remain[42], count = 0, i; for (i = 0; i > num; int R = num % 42; remain[R]++; } for (i = 0; i < 42; i++) { if (remain[i] != 0) ..
문제 풀이 입력을 받을 때마다 그 수를 최소, 최대값과 비교했다. 입력을 전부 한번에 받고, 비교를 할 수도 있었겠지만 for문을 2번 쓰는게 귀찮았다. min과 max를 갱신할 때 if - else if를 사용하지 않았다. 왜냐하면 만약 배열에 수가 하나인 경우엔 그 수가 최소값이자 최대값이 되겠지만 if - else if문을 사용하면 둘 중 하나만 갱신되기 때문에 값이 제대로 반영되지 않는다. 소스코드 #include using namespace std; int main() { int N, min = 1000001, max = -1000001; cin >> N; int* A = new int[N]; for (int i = 0; i > A[i]; if (A[i] < min..
문제 풀이 일단 기존의 수가 손상되면 안되니까 N을 temp에 저장한다. 그리고 연산을 통해 얻은 새로운 수를 new_num에 저장하고 N과 new_num이 같을 때까지 while문을 돈다. N_f, N_b는 각각 십의 자리 수와 일의 자리 수다. 적당히 문제보면서 연산 만들어주고 while문 한 번 돌 때마다 count 체크해준다. 소스코드 #include using namespace std; int main() { int N, count = 0, new_num = -1, sum, temp; int N_f, N_b; cin >> N; temp = N; while (N != new_num) { if (temp < 10) { N_f = 0; N_b = temp; } else { N_f = temp / 10..