diff --git a/src/jihye/thisiscodingtest/part03/Q09_stringCompression/Solution.java b/src/jihye/thisiscodingtest/part03/Q09_stringCompression/Solution.java index a399575..6b7c933 100644 --- a/src/jihye/thisiscodingtest/part03/Q09_stringCompression/Solution.java +++ b/src/jihye/thisiscodingtest/part03/Q09_stringCompression/Solution.java @@ -1,7 +1,6 @@ package jihye.thisiscodingtest.part03.Q09_stringCompression; public class Solution { - private static boolean check = false; public static void main(String[] args) { String s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; @@ -13,54 +12,52 @@ public static int solution(String s) { int answer = s.length(); while (true) { - if (unit > s.length() / 2) {//자르는 단위가 절반을 넘어가면 break + if (unit > s.length() / 2) { //자르는 단위가 절반을 넘어가면 break break; } else { - int n = CompressedStringLength(unit, s); - if (check == true) { - answer = Math.min(answer, n); - } + int n = getCompressedStringLength(unit, s); + answer = Math.min(answer, n); } unit++; - check = false; } return answer; } - public static int CompressedStringLength(int unit, String s) {//문자열 찾기 구간 + public static int getCompressedStringLength(int unit, String s) { //문자열 찾기 구간 StringBuilder compressedString = new StringBuilder(); - String oneUnit = s.substring(0, unit);//하나의 일치하는 스트링 단위 + String current = s.substring(0, unit); //하나의 일치하는 스트링 단위 int end = 0; + //문자열을 자르는 단위만큼 잘라서 다음 단위와 일치하는지 //일치한다면 그 수를 count해서 newString에 넣어준다 + for (int i = unit; i < s.length(); i += unit) { int count = 1; - while (isSame(i , s, unit, oneUnit)) { + while (isSame(i , s, unit, current)) { count++; i = i + unit; } - if (count > 1) {//count가 2이상일때 - check = true; - compressedString.append(Integer.toString(count));//newString에 count와 반복되는 string(one)을 넣는다 System.out.println(newString); - compressedString.append(oneUnit); - } else { - compressedString.append(oneUnit); + if (count > 1) { //count가 2이상일때 + compressedString.append(Integer.toString(count)); //newString에 count와 반복되는 string(one)을 넣는다 System.out.println(newString); } - if (i + unit > s.length()) {//범위 체크 + compressedString.append(current); + + if (i + unit > s.length()) { //범위 체크 end = i; break; } - oneUnit = s.substring(i, i + unit); - + current = s.substring(i, i + unit); } - if (end <= s.length()) {//만일 남은 unit단위 보다 작은 문자열이 남았을시 더해준다. + + if (end <= s.length()) { //만일 남은 unit단위 보다 작은 문자열이 남았을시 더해준다. compressedString.append(s.substring(end)); } return compressedString.length(); } + public static boolean isSame(int i , String s, int unit, String oneUnit){ return i <= s.length() - unit && s.substring(i, i + unit).equals(oneUnit); } -} +} \ No newline at end of file diff --git a/src/jihye/thisiscodingtest/part03/Q22_movingBlock/MainFail.java b/src/jihye/thisiscodingtest/part03/Q22_movingBlock/MainFail.java new file mode 100644 index 0000000..8e05dce --- /dev/null +++ b/src/jihye/thisiscodingtest/part03/Q22_movingBlock/MainFail.java @@ -0,0 +1,138 @@ +//package jihye.thisiscodingtest.part03.Q22_movingBlock; +// +//import java.util.Arrays; +//import java.util.LinkedList; +//import java.util.Queue; +//import java.util.Scanner; +// +///* +//(1,1)의 위치에서 (N,N)까지 이동하는데 걸리는 시간을 출력 +// +//무지가 이동취할 수 있는 행동 +//1. 상,하,좌,우 이동 +//2. 90도 돌기 first기준, second기준 으로 2가지 방향으로 가능 +// +// */ +//class Node{ +// +// public Node(int xFirst, int yFirst, int xEnd, int yEnd, boolean ishorizontal) { +// this.xFirst = xFirst; +// this.yFirst = yFirst; +// this.xEnd = xEnd; +// this.yEnd = yEnd; +// this.ishorizontal = ishorizontal; +// } +// +// public int getxFirst() { +// return xFirst; +// } +// +// public void setxFirst(int xFirst) { +// this.xFirst = xFirst; +// } +// +// public int getyFirst() { +// return yFirst; +// } +// +// public void setyFirst(int yFirst) { +// this.yFirst = yFirst; +// } +// +// public int getxEnd() { +// return xEnd; +// } +// +// public void setxEnd(int xEnd) { +// this.xEnd = xEnd; +// } +// +// public int getyEnd() { +// return yEnd; +// } +// +// public void setyEnd(int yEnd) { +// this.yEnd = yEnd; +// } +// public boolean isHorizontal() { +// return ishorizontal; +// } +// +// public void setisHorizontal(boolean horizontal) { +// this.ishorizontal = horizontal; +// } +// +// int xFirst; +// int yFirst; +// int xEnd; +// int yEnd; +// boolean ishorizontal; +// +// +// +//} +//public class MainFail { +// static int answer; +// static int N; +// static int dx[] = {-1,1,0,0}; +// static int dy[] = {0,0,-1,1}; +// +// public static void main(String[] args) { +// Scanner sc = new Scanner(System.in); +// +// } +// public int solution(int[][] board) { +// answer = 0; +// N = board.length; +// +// bfs(board); +// return answer; +// } +// public static void bfs(int[][] board){ +// Queue queue = new LinkedList<>(); +// boolean visited[][] = new boolean[board.length+1][board.length+1]; +// Arrays.fill(visited[0], true); +// +// queue.add(new Node(1,1,1,2, true)); +// while (!queue.isEmpty()){ +// Node current = queue.poll(); +// +// int xFirst = current.getxFirst(); +// int yFirst = current.getyFirst(); +// int xEnd = current.getxEnd(); +// int yEnd = current.getyEnd(); +// boolean isHorizontal = current.isHorizontal(); +// +// for (int i = 0; i < 4; i++) { +// +// //이동시에 두가지 케이스로 나뉜다. +// //가로일시, 세로일시 +// if(isHorizontal){ //가로일때 +// int nxFirst = xFirst + dx[i]; +// int nyFirst = yFirst + dy[i]; +// int nxEnd = xEnd + dx[i]; +// int nyEnd = yEnd + dy[i]; +// }else{ //세로일때 +// int nxFirst = xFirst + dx[i]; +// int nyFirst = yFirst + dy[i]; +// int nxEnd = xEnd + dx[i]; +// int nyEnd = yEnd + dy[i]; +// } +// +// if(boundaryCheck(nxFirst,nyFirst,nxEnd, nyEnd) || visit[nx][ny] ){ +// //90도 도는 로직 +// +// } +// +// } +// } +// } +// public static void turn(){ +// +// } +// //범위를 넘어가는지 확인하는 메서드 +// public static boolean boundaryCheck(int nxFirst,int nyFirst,int nxEnd, int nyEnd){ +// return nxFirst < 0 || nyFirst < 0 || nxFirst >= N || nyFirst >= N || +// nxEnd < 0 || nyEnd < 0 || nxEnd >= N || nyEnd >= N; +// } +//} diff --git a/src/jihye/thisiscodingtest/part03/Q22_movingBlock/Solution.java b/src/jihye/thisiscodingtest/part03/Q22_movingBlock/Solution.java new file mode 100644 index 0000000..95df82d --- /dev/null +++ b/src/jihye/thisiscodingtest/part03/Q22_movingBlock/Solution.java @@ -0,0 +1,172 @@ +//package jihye.thisiscodingtest.part03.Q22_movingBlock; +// +//import java.util.Arrays; +//import java.util.LinkedList; +//import java.util.Queue; +//import java.util.Scanner; +// +///* +//(1,1)의 위치에서 (N,N)까지 이동하는데 걸리는 시간을 출력 +// +//무지가 이동취할 수 있는 행동 +//1. 상,하,좌,우 이동 +//2. 90도 돌기 first기준, second기준 으로 2가지 방향으로 가능 +// +// */ +//class Node { +// +// public Node(int xFirst, int yFirst, int xEnd, int yEnd) { +// this.xFirst = xFirst; +// this.yFirst = yFirst; +// this.xEnd = xEnd; +// this.yEnd = yEnd; +// } +// +// public int getxFirst() { +// return xFirst; +// } +// +// public void setxFirst(int xFirst) { +// this.xFirst = xFirst; +// } +// +// public int getyFirst() { +// return yFirst; +// } +// +// public void setyFirst(int yFirst) { +// this.yFirst = yFirst; +// } +// +// public int getxEnd() { +// return xEnd; +// } +// +// public void setxEnd(int xEnd) { +// this.xEnd = xEnd; +// } +// +// public int getyEnd() { +// return yEnd; +// } +// +// public void setyEnd(int yEnd) { +// this.yEnd = yEnd; +// } +// +// public boolean isHorizontal() { +// return ishorizontal; +// } +// +// public void setisHorizontal(boolean horizontal) { +// this.ishorizontal = horizontal; +// } +// +// int xFirst; +// int yFirst; +// int xEnd; +// int yEnd; +// boolean ishorizontal; +//} +// +//public class Solution { +// static int answer; +// static int N; +// static int dx[] = {-1, 1, 0, 0}; +// static int dy[] = {0, 0, -1, 1}; +// +// public static void main(String[] args) { +// Scanner sc = new Scanner(System.in); +// int[][] board = {{0, 0, 0, 1, 1}, {0, 0, 0, 1, 0}, {0, 1, 0, 1, 1}, +// {1, 1, 0, 0, 1}, {0, 0, 0, 0, 0}}; +// System.out.println(solution(board)); +// } +// +// public static int solution(int[][] board) { +// answer = 0; +// N = board.length; +// +// bfs(board); +// return answer; +// } +// +// public static void bfs(int[][] board) { +// Queue queue = new LinkedList<>(); +// boolean visited[][][] = new boolean[board.length + 1][board.length + 1][2]; +// Arrays.fill(visited[0], true); +// int[] rotate = {-1, 1}; +// +// queue.add(new Node(1, 1, 1, 2)); +// while (!queue.isEmpty()) { +// Node current = queue.poll(); +// +// int xFirst = current.getxFirst(); +// int yFirst = current.getyFirst(); +// int xEnd = current.getxEnd(); +// int yEnd = current.getyEnd(); +// boolean isHorizontal = current.isHorizontal(); +// +// if (hasArrived(xFirst, yFirst, xEnd, yEnd)) { +// return; +// } +// +// //상하좌우 이동 +// for (int i = 0; i < 4; i++) { +// int nxFirst = xFirst + dx[i]; +// int nyFirst = yFirst + dy[i]; +// int nxEnd = xEnd + dx[i]; +// int nyEnd = yEnd + dy[i]; +// +// if ((board[nxFirst][nyFirst] == 0) && (board[nxEnd][nyEnd] == 0)) { +//// if(!(visited[nxFirst][nyFirst]) && (visited[nxEnd][nyEnd]))//빙문 확인후 +// queue.add(new Node(nxFirst, nyFirst, nxEnd, nyEnd)); +// queue.add(new Node(nxEnd, nyEnd, nxFirst, nyFirst)); +// } +// } +// +// //가로 회전 +// if (xFirst == xEnd) { +// for (int r : rotate) { +// int nxFirst = xFirst + r; +// int nyFirst = yFirst; +// int nxEnd = xEnd + r; +// int nyEnd = yEnd; +// +// if ((board[nxFirst][nyFirst] == 0) && (board[nxEnd][nyEnd] == 0)) { +// !(visited[nxFirst][nyFirst]) && (visited[nxEnd][nyEnd]) +// queue.add(new Node(nxFirst, nyFirst, nxEnd, nyEnd)); +// queue.add(new Node(nxEnd, nyEnd, nxFirst, nyFirst)); +// } +// } +// } +// +// //세로 회전 +// if (yFirst == yEnd) { +// for (int r : rotate) { +// int nxFirst = xFirst; +// int nyFirst = yFirst + r; +// int nxEnd = xEnd; +// int nyEnd = yEnd + r; +// +// if (!(visited[nxFirst][nyFirst]) && (visited[nxEnd][nyEnd])) { +// queue.add(new Node(nxFirst, nyFirst, nxEnd, nyEnd)); +// queue.add(new Node(nxEnd, nyEnd, nxFirst, nyFirst)); +// } +// } +// } +// answer++; +// } +// } +// +// +// //범위를 넘어가는지 확인하는 메서드 +// public static boolean boundaryCheck(int nxFirst, int nyFirst, int nxEnd, int nyEnd) { +// return nxFirst < 0 || nyFirst < 0 || nxFirst >= N || nyFirst >= N || +// nxEnd < 0 || nyEnd < 0 || nxEnd >= N || nyEnd >= N; +// } +// +// //도착했는지 확인 +// public static boolean hasArrived(int xFirst, int yFirst, int xEnd, int yEnd) { +// return (xFirst == N && yFirst == N) || (xEnd == N && yEnd == N); +// } +//}