import java.util.*;
public class main {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(Arrays.toString(s.Chap4Example01(5, new String[]{"R","R","R","U","D","D"})));
//Guide 생략
System.out.println(s.Chap4Example02Guide(5));
//규칙성 찾지 말고 그냥 완전탐색을 쓰라고 한다. 10만건 이하의 건이기 때문에 시간이 더 늘어날 일이 없으므로..
//애초에 hour + minute + second 에서 "24"의 contains을 확인할 때, 024011과 같은 경우처럼 hour과 minute가 붙어있어야 확인이 되는 경우도 있으므로...
System.out.println(s.Chap4Example03("a1"));
System.out.println(s.Chap4Example03Guide("a1"));
//조건을 확인하고 count를 하는 과정은 조건문이 너무 많이 사용되니 일단 값을 계산하고 한번에 조건을 확인한다.
System.out.println(s.Chap4Example04(4,4,new int[]{1,1,0},new int[][]{{1,1,1,1},{1,0,0,1},{1,1,0,1},{1,1,1,1}}));
//Guide 생략
}
}
class Solution {
public int[] Chap4Example01(int n, String[] moves){
int[] pos = new int[2];
//y, x로 가정 좌상이 0,0
for(String s : moves) {
switch (s) {
case "R":
if(pos[1]+1 < n)
pos[1]++;
break;
case "L":
if(pos[1]-1>-1)
pos[1]--;
break;
case "U":
if(pos[0]-1> -1)
pos[0]--;
break;
case "D":
if(pos[0]+1 < n)
pos[0]++;
break;
}
}
pos[0]++;
pos[1]++;
return pos;
}
public int Chap4Example02(int n) {
int answer = 0;
//n이 포함되는 모든 시간 체크
//nn:nn:nn
//n~~~~~~~규칙성은 없을까..?
//
return answer;
}
public int Chap4Example02Guide(int n) {
//000000~235959까지 경우의 수가 10만개가 되지 않으므로 완전탐색 하는게 낫다고 한다..
int answer = 0;
for(int i = 0; i<n+1;++i) {
for(int j = 0; j<60;++j) {
for(int k = 0; k<60;++k) {
String s = Integer.toString(i)+Integer.toString(j)+Integer.toString(k);
if(s.contains("3")) {
answer++;
}
}
}
}
return answer;
}
public int Chap4Example03(String pos) {
int answer = 0;
String[] xyPos = pos.split("");
//'a' = 97 then 'a'-96 = 1
int x = (int)xyPos[0].charAt(0)-(int)'a'+1;
int y = Integer.parseInt(xyPos[1]);
if(x > 2) {
if(y > 1) {
answer++;
}
if(y < 8) {
answer++;
}
}
if(x < 6) {
if(y > 1) {
answer++;
}
if(y < 8) {
answer++;
}
}
if(y > 2) {
if(x > 1) {
answer++;
}
if(x < 8) {
answer++;
}
}
if(y < 6) {
if(x > 1) {
answer++;
}
if(x < 8) {
answer++;
}
}
return answer;
}
public int Chap4Example03Guide(String pos) {
int answer = 0;
String[] xyPos = pos.split("");
//'a' = 97 then 'a'-96 = 1
int x = (int)xyPos[0].charAt(0)-(int)'a'+1;
int y = Integer.parseInt(xyPos[1]);
int[][] steps = new int[][]{{-2, -1}, {-1, -2}, {1, -2}, {2, -1}, {2, 1}, {1, 2}, {-1, 2}, {-2, 1}};
for(int[] step : steps) {
int nX = x+step[0];
int nY = y+step[1];
if(nX >= 1 && nX <= 8 && nY >= 1 && nY <= 8) {
answer++;
}
}
return answer;
}
public int Chap4Example04(int m, int n, int[] character, int[][] map) {
int answer = 0;
int[][] visited = new int[n][m];//m: x, n: y
visited[character[0]][character[1]] = 1;//0: x, 1: y
answer++;
int notMoveCount = 0;
int[][] move = new int[][]{{-1,0}, {0,-1}, {1,0}, {0,1}};
while(true) {
character[2] = (character[2]-1 < 0) ? 3 : character[2]-1;
int tmpX = character[1]+move[character[2]][1];
int tmpY = character[0]+move[character[2]][0];
if(tmpX >= 0 && tmpY >= 0 && tmpX < m && tmpY < n && visited[tmpY][tmpX] == 0 && map[tmpY][tmpX] == 0) {
character[1] = tmpX;
character[0] = tmpY;
answer++;
visited[tmpY][tmpX] = 1;
}
else {
notMoveCount++;
if(notMoveCount == 4) {
notMoveCount = 0;
int nextMove = (character[2] + 2) % 4;
tmpX = character[1]+move[nextMove][1];
tmpY = character[0]+move[nextMove][0];
if(tmpX < 0 || tmpY < 0 || tmpX >= m && tmpY >= n || map[tmpY][tmpX] == 1)
break;
character[0] = tmpY;
character[1] = tmpX;
}
}
}
return answer;
}
}
완전탐색 문제들이라고 봐야 하나
'책(이것이 취업을 위한 코딩 테스트다)' 카테고리의 다른 글
이것이 취업을 위한 코딩테스트다. Chapter08 (0) | 2021.06.23 |
---|---|
이것이 취업을 위한 코딩테스트다. Chapter07 (0) | 2021.06.20 |
이것이 취업을 위한 코딩테스트다. Chapter06 (0) | 2021.06.15 |
이것이 취업을 위한 코딩테스트다. Chapter05 (0) | 2021.06.13 |
이것이 취업을 위한 코딩테스트다. Chapter03 (0) | 2021.06.07 |