-
이것이 코딩테스트다 - 4) 구현알고리즘 2021. 1. 21. 20:05
깃허브에 올리는게 11일만이라서 너무 민망...😂
죄책감 어쩔 것이여...😭
아예 안한건 아니고 자바기초를 다시 보고 스프링 강의를 시작해서 그런거다. (그러하다)
알고리즘도 빼지 말고 다시 달리자!
4.1) 상하좌우
#include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <climits> #include <string> using namespace std; int n; string A; int x = 1; int y = 1; int dx[4] = { 0,0,-1,1 }; int dy[4] = { -1,1,0,0 }; char movetypes[4] = { 'L', 'R', 'U', 'D' }; int main() { cin >> n; cin.ignore();//버퍼 비우기 getline(cin, A); for (int i = 0; i < A.length(); i++) { int nx; int ny; for (int j = 0; j < 4; j++) { if (A[i] == movetypes[j]) { nx = x + dx[j]; ny = y + dy[j]; } } if (nx <1 || nx > n || ny <1 || ny > n) continue; x = nx; y = ny; } cout << "(" << x << "," << y << ")" << endl; /* 처음에 짠 코드 int n; string A; int Now[2] = { 1, 1 }; cin >> n; cin >> A; for (int i = 0; i < A.length(); i++) { if (A[i] == 'L') { if (Now[1] - 1 < 1) continue; Now[1] -= 1; } else if (A[i] == 'R') { if (Now[1] + 1 < n) continue; Now[1] += 1; } else if (A[i] == 'U') { if (Now[0] - 1 < 1) continue; Now[0] -= 1; } else { if (Now[0] + 1 < n) continue; Now[0] += 1; } } cout << "(" << Now[0] << "," << Now[1] << ")" << endl; */ return 0; }
4.2) 시각
#include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <climits> #include <string> using namespace std; int h, cnt; bool Check(int h, int m, int s) { if (h % 10 == 3 || m / 10 == 3 || m % 10 == 3 || s / 10 == 3 || s % 10 == 3) return true; return false; } int main() { cin >> h; for (int i = 0; i <= h; i++) { for (int j = 0; j < 60; j++) { for (int k = 0; k < 60; k++) { if (Check(i, j, k)) cnt++; } } } cout << cnt << endl; return 0; }
4.3) 왕실의 나이트
#include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <climits> #include <string> using namespace std; int dx[8] = { 2, -2, 2, -2, 1, -1, 1, -1 }; int dy[8] = { -1, -1, 1, 1, 2, 2, -2, -2 }; int main() { int cnt = 0; string Now; cin >> Now; int x = (int)Now[0] - 97; int y = (int)Now[1] - 49; for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || ny < 0 || nx>7 || ny>7) continue; cnt++; } cout << cnt << endl; return 0; }
4.4) 게임 개발
이 부분은 예제문제가 더 있으면 확인 가능할 텐데, 내가 푼 방법으로도 정답이 나오긴 했다.
정답을 보니 같은 의미인 것 같아서 굳이 수정하지 않았다.
#include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <climits> #include <string> using namespace std; int dx[4] = { 0, 1, 0, -1 };//북, 동, 남, 서 int dy[4] = { -1, 0, 1, 0 }; int main() { int n, m, cnt = 1; cin >> n >> m; int x, y, direction; cin >> x >> y >> direction;//현재위치 정보와 방향을 입력받는다. int Land[51][51];//땅의 정보를 받을 공간 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cin >> Land[i][j]; } Land[x][y] = 1;//시작한 공간은 방문한 공간으로 다시 갈 수 없으므로 바다로 만든다. while (true) { bool flag = false; for (int i = 0; i < 4; i++)//4방향으로 { direction -= 1;// 방향을 왼쪽으로 돌린다. if (direction < 0) direction += 4; int nx = x + dx[direction]; int ny = y + dy[direction]; if (Land[nx][ny] == 0)//만약 왼쪽으로 돌린 방향으로 갈 수 있다면 { x = nx; //이동한 후에 y = ny; flag = true;// 이동하는데 성공했다는 표시를 남기고 Land[nx][ny] = 1;//방문한 곳으로 표시한다. cnt++; break; } } if (!flag)//만약 이동하지 못했다면 { if (Land[x - dx[direction]][y - dy[direction]] != 0) break;//뒤쪽으로 이동해보는데 이동할 수 없다면 그대로 종료한다. else {//만약 이동이 가능하다면 뒤쪽으로 이동하고 다시 시작한다. x -= dx[direction]; y -= dy[direction]; Land[x - dx[direction]][y - dy[direction]] = 1;//간 곳은 방문 표시해준다. cnt++; } } } cout << cnt << endl; return 0; }
✨방향문제가 나오면 방향 배열을 짜서 더하는 쪽으로 간다.
'알고리즘' 카테고리의 다른 글
이것이 코딩테스트다 - 6) 정렬 (0) 2021.01.24 이것이 코딩테스트다 - 5) DFS/BFS (0) 2021.01.22 이것이 코딩테스트다 - 3)그리디 (0) 2021.01.06 알고리즘 문제 해결 전략 - 9.7) k번째 최대 증가 부분 수열 (0) 2021.01.04 알고리즘 문제 해결 전략 - 9.6) 모스 부호 사전 (0) 2021.01.04