목록💻 현생/⛓ 알고리즘 (223)
궤도
문제 풀이 문제에서 입력을 종료하는 조건을 딱히 명시하지 않았다. 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..
문제 풀이 이 문제를 보기 전에 [EPPER] 10회 7번 [EPPER] 10회 7번 문제 풀이 이 문제는 한가지만 떠올리면 난이도가 아주 낮아진다. 바로 테두리를 두르는 것이다. 이렇게 말이다. 왜냐면 왼쪽 그대로 입력을 받아 문제를 풀면 테두리에 있는 지역을 계산하기 �� myunji.tistory.com [EPPER] 12회 10번 [EPPER] 12회 10번 문제 풀이 어렵다. 큐를 이용하라는데 c++도 아닌 마당에 큐를 하나하나 구현하고 싶진 않아서 그냥 내맘대로 구현했다. 그리고 이게 더 편한 것 같다. 큐로 구현하려면 내가 쓴 논리 구조랑 아주 myunji.tistory.com 이 두개를 보면 편할 것이다. 10회 7번에서 지뢰찾기 함수를 편하게 쓰기 위해 테두리를 둘렀었다. 이번에도 테두리..
문제 풀이 약간 고민하다가 설마 이렇게 하면 될까 싶어서 얼레벌레 풀었는데 얼레벌레 풀렸다. 그래서 뭐라고 설명해야 할지는 잘 모르겠고, 아마 코드를 읽어보면 대충 이해될 것 같다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include char matrix[50][50]; char scan_matrix[250][250]; int main() { int R, C, ZR, ZC; char empty; scanf("%d %d %d %d", &R, &C, &ZR, &ZC); for (int i = 0; i < R; i++) { scanf("%c", &empty); for (int j = 0; j < C; j++) { scanf("%c", &matrix[i][j]); } } for (..
문제 풀이 난 이렇게 도형이 나오고 소수점이 나오는 문제에 약하다. 진짜 약하단 뜻은 아니고, 그냥 하기 싫다는 뜻이다. 입력은 다음과 같다. 1. x1==0 2. y1==0 3. x1!=0 && y1!=0 그리고 아주 특별한 경우가 아니라면 저 커다란 삼각형은 삼각형 하나와 사각형 하나로 잘릴 것이다. 분명히 이상하게 생겼을 사각형의 넓이를 구하는건 의미없는 뻘짓일테니 삼각형의 넓이를 구하자. 대충 그림을 그려보면 알겠지만 1번의 경우엔 s1이 삼각형이고, 2번의 경우엔 s2가 삼각형이다. 대충 연필로 끄적이면서 식세우고 코드로 작성하자. 설마 x+y = 250이라는걸 모르는 사람은 없겠지? 3번의 경우라면 어떻게 해야할까? 이것도 대충 선분을 몇 개 그어보면 알 수 있다. x1이 125보다 크면 s1..
문제 풀이 바라는게 참 많은 문제다. 일단 각 단어와 그 등장 횟수도 저장해야 하니 구조체를 사용한다. 단어들을 입력받으면서 등장 횟수를 0으로 초기화 한다. 단어 목록을 완성했으니, 첫 문자들도 first 배열에 저장한다. 등장 횟수가 같은 경우엔 사전순으로 단어를 선택한다고 했으니 배열에 들어온 단어들을 사전순으로 정렬한다. 그냥 삽입정렬을 단어 버전으로 적용했다. 혹시 모를 오류가 생길 수도 있으니까 그냥 맘편하게 strcpy와 strcmp를 썼다. printWord 함수에서 각 문자에 대해 출력할 단어를 선택한다. 일단 문자에 대해 출력될 수 있는 단어가 여러개일 수 있으니 문자와 단어의 첫 문자가 일치하는 모든 단어를 출력 후보 배열 flag에 넣는다. 모든 단어를 다 탐색한 뒤, 후보 배열에 ..