목록분류 전체보기 (291)
궤도
문제 풀이 뭔가 최댓값을 먼저 구하고 그 값을 기준으로 모든 수를 조작한 뒤 새롭게 평균을 구해야할 것 같은 착각이 드는 문제다. 하지만 사실 그냥 기존 입력의 합을 구한 뒤 (합)/(최댓값)*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..
문제 풀이 문제에서 입력을 종료하는 조건을 딱히 명시하지 않았다. EOF로 처리해야 한다는 뜻이다. 옳은 입력이라면 숫자가 2개 들어올테니까 그렇지 않다면 입력이 끝난걸로 처리하면 될 것이다. 여기엔 cin.eof() 함수를 사용하는데, 입력이 없을시 true값을 반환한다고 한다. 소스코드 #include using namespace std; int main() { int A, B; while (true) { cin >> A >> B; if (cin.eof() == true) break; cout
문제 풀이 별건 아니고 그냥 c++에서 입출력 속도를 높이는 방법을 처음 알게된 문제라서 기록한다. 위에서 cin.tie(NULL)과 sync_with_stdio(false)를 해주면 된다는데 어떤 역할을 하는지 어렴풋이 알 것 같긴하다. 그리고 endl이 엄청 느리다는 것도 이 문제를 풀면서 처음 알았다. \가 자판에서 애매하게 멀어서 '\n'대신 애용하고 있었는데 아쉽다. 소스코드 #include using namespace std; int main() { cin.tie(NULL); std::ios_base::sync_with_stdio(false); int T, A, B, i; cin >> T; for (i = 0; i > A >> B; cout
문제 풀이 먼저 위 그림에 나오는 키보드를 만든다. 그리고 목적지를 pos 배열에 저장하고 사용자가 지금까지 입력한 배열을 input에 넣는다. 그런 다음 compareStr 함수를 사용해 현재 input에서 선택할 수 있는 단어를 고른다. 그냥 input의 처음부터 끝까지 비교하며 전부 일치하는지 확인하는 거다. 일치한다면 해당 단어의 다음 문자를 배열에 넣고, 그 배열을 기반으로 changePad 함수에서 키보드를 바꿔준다. 약간 노가다성 코드가 없잖아 있는데 문제 자체에 노가다성이 있지 않은가 싶다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include #include #include char keypad[5][9] = { {'*', '*', '*', 'A', 'B', ..
문제 풀이 유명한 동적계획법 문제들 중 하나이다. 위에서 아래로 내려가며 계산하는 방법이 있고, 아래에서 위로 올라가며 계산하는 방법이 있다. 후자가 훨씬 쉽고 간단하기 때문에 그 방법으로 풀었다. 맨 아랫줄에 대한 최대값은 자기 자신이니 그 윗줄부터 계산한다. 9의 경우엔 2와 7중 더 큰 수와 더하면 될 것이다. 4의 경우엔 7과 5 중에서 고르면 되겠다. 그런식으로 맨 위에 있는 6까지 갱신해준다. 새로운 matrix[0][0] 값을 반환하면 끝난다. #define _CRT_SECURE_NO_WARNINGS #include int matrix[100][100]; int max(int a, int b) { if (a > b) return a; else return b; } int main() { in..