목록EPPER (37)
궤도
문제 풀이 먼저 위 그림에 나오는 키보드를 만든다. 그리고 목적지를 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에 넣는다. 모든 단어를 다 탐색한 뒤, 후보 배열에 ..
문제 풀이 동적계획법 문제의 수많은 유형 중 하나이다. 이런류의 문제를 처음 봤다면 어렵겠지만, 몇 개 풀어보고 나면 그 문제가 그 문제라 원활하게 풀 수 있다. 각 index에서의 최댓값을 m_max에 저장한다. 그럼 이제 m_max에 값이 어떻게 들어가는지 살펴보겠다. m_max[1] : 돈이 1개라면 그냥 그걸 주워가면 된다. 그러므로 m_max[1] = m[1] m_max[2] : 돈이 2개여도 그걸 다 주워간다 해서 규칙을 어기진 않는다. 그러므로 m_max[2] = m[1] + m[2] m_max[3] : 돈이 3개라면 이제 모든 돈을 주워갈 수는 없다. 3개 중 금액이 가장 커질 수 있는 2장을 가져가자. (근데 코드는 왜 [1]+[2]를 까먹었지? 실수한 것 같다.) m_max[n] (n>..
문제 풀이 너무 어렵게 생각해서 시간이 좀 걸렸다. 단순하게 생각하면 된다. 양끝을 서로 비교한다. 그럼 이 셋 중 하나일 것이다. 1. 양끝 숫자가 같다. 2. 왼쪽 숫자 오른쪽 숫자 1번의 경우라면 회문 조건을 충족하니 한칸씩 안으로 들어가면 된다. 2번의 경우라면 왼쪽 숫자가 커지도록 인접한 숫자와 더해주고, 3번의 경우라면 오른쪽 숫자가 커지도록 인접한 숫자와 더해준다. 재귀함수로 구현했는데, 반복문으로 구현해도 어려움은 없을 것 같다. 소스코드 #define _CRT_SECURE_NO_WARNINGS #include int cnt = 0; int arr[10]; void pal(int start, int end) { if (start == end || star..