월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
트리 레벨 체크로는 안되는건가요??
예전 BFS 영상에서 최단 경로 길이를 구하기 위해서는 트리 레벨 체크를 활용하는 것을 보고 이번에도 큐 사이즈 만큼 반복을 돌아서 트리 레벨을 체크 하는 방식으로 구현하였는데프로그램에선 12로 잘 나오지만, 채점에선 오류가 떠서 이 방식으론 안되는지 궁금합니다.. 또, 강의를 들으면서 배열에 +1씩 추가하는 아이디어를 보고 기존의 배열에서 +1씩 해주어 수정한 결과는 통과하였는데, DIS배열을 하나 더 만든 이유도 궁금합니다! 추가로 젤 윗 이야기인 큐 사이즈 만큼 반복하여 레벨을 체크하는 상황과 배열에 +1씩 하여 넓혀가는 상황의 구별을 어떻게 할 수 있을지도 궁금해졌습니다... 감사합니다 import java.awt.*; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class In_8_11 { static int[][] matrix = new int[8][8]; static int[] dx = {-1, 0, 1, 0}; static int[] dy = {0, 1, 0, -1}; static int level; public static int BFS(int x, int y) { Queue<Point> Q = new LinkedList<>(); // 가장 처음 큐에 넣기 Q.offer(new Point(x,y)); matrix[1][1] = 1; // 출발지점 꼭 걸어줘야함. // 시작 while( !Q.isEmpty()){ for (int j = 0; j < Q.size(); j++) { Point P = Q.poll(); System.out.println("( "+P.x + " , " + P.y+" )"); if (P.x == 7 && P.y == 7){ //return matrix[7][7] -1; return level; } for (int i = 0; i < 4; i++) { int nx = P.x + dx[i]; int ny = P.y + dy[i]; if (1 <= nx && nx <= 7 && 1 <= ny && ny <= 7) { if (matrix[nx][ny] == 0) { matrix[nx][ny] = 1; //matrix[nx][ny] = matrix[P.x][P.y] +1; // 뺄 필요 없을 거 같은데? Q.offer(new Point(nx, ny)); } } } }level++; } return -1; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); for(int i = 1; i <= 7; i++){ for(int j = 1; j <= 7; j++) { matrix[i][j] = sc.nextInt(); } } System.out.println( BFS(1, 1) ); } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
아나그램 사이즈 관련 질문입니다.
만약 아나그램 b 가 bbb 라면?해쉬맵의 사이즈가 0이 되서 아나그램 비교자체가 안되지 않을까라는.. 의문이 들어서 질문드립니다 ~
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
ch 배열의 값을 확인해서 더 이상 반복문이 돌지 않도록 하는 것도 유효한가요?
private static int solution(int v, int cost) { int answer = 0; Queue<Edge> pq = new PriorityQueue<>(); pq.offer(new Edge(v, cost)); while (!pq.isEmpty()) { if (successTree()) { // 모든 노드가 트리에 추가되었을 때는 반복문을 더이상 돌지않는다. break; } Edge cur = pq.poll(); if (ch[cur.v]) { continue; } ch[cur.v] = true; answer += cur.cost; for (Edge edge : graph.get(cur.v)) { if (!ch[edge.v]) { pq.offer(edge); } } } return answer; } private static boolean successTree() { for (boolean check : ch) { if (!check) { return false; // 아직 연결 안 된 노드가 있다면 false를 return } } return true; // 이미 트리가 다 완성되었다면 true를 return } 이렇게 pq를 도는 반복문에 successTree라는 메소드를 추가하여 모든 노드가(=도시) 트리에 포함되었다면 바로 true를 return 시켜 pq에 대한 반복문이 돌지 않도록 수정했습니다.이게 코드 수행 시간에 더 효율적인 방법인지 강사님의 의견이 궁금하여 질문해봅니다!저는 마지막 노드까지 트에 추가되었어도 pq에 남아있는 값들이 있어 의미없는 로직을 돌 것이라고 생각해 추가하게 되었습니다만 ch 배열을 탐색하는 데에 걸리는 시간이 더 걸려 해당 로직을 수행하는 것이 더 비효율적인지 궁금합니다.또한, 이미 노드가 다 들어가있다면 그 뒤에 pq가 반복할 일이 없어 해당 메소드가 의미가 있는지 없는지 궁금합니다. 이전에 pq에 남아있는 노드들이 poll()될 수 있다고 생각했거든요..// 항상 강의 잘 보고있습니다. 감사합니다.
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
소수 뒤집기 문제 다른 방식으로 풀기
복잡하게 푼 것 같기는 한데, 혹시 어떻게 수정하면 정답이 될까요?인풋, 아웃풋은 잘 나오는데 채점 사이트에서는 오답이라고 뜹니다. import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; class Main { public String solution(int n, int[] intArr){ String answer = " "; int[] intPrimeArray= new int[n]; for(int i=0; i<n; i++){ int indexInt= intArr[i]; int remain; int reverse=0; while(indexInt > 0){ remain= indexInt%10; reverse= reverse*10 + remain; indexInt = indexInt/10; } intPrimeArray[i] = reverse; int flag= 0; if(intPrimeArray[i]==1) flag=1; for(int j=2; j<intPrimeArray[i]; j++){ if(intPrimeArray[i] % j ==0 ) flag=1; } if(flag==0) answer += intPrimeArray[i] + " "; } return answer; } public static void main(String[] args) { Main T = new Main(); Scanner sc= new Scanner(System.in); int n = sc.nextInt(); int[] intArr = new int[n]; for(int i=0; i<n; i++){ intArr[i]= sc.nextInt(); } System.out.println(T.solution(n, intArr)); } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
Array 12) 멘토링 문제 짝 클래스 객체와 Map을 활용하는 풀이방식
public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[][] arr = new int[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { arr[i][j] = sc.nextInt(); } } System.out.println(answer(n, m, arr)); } static class Pair { int mento; int menti; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Pair)) return false; Pair pair = (Pair) o; return mento == pair.mento && menti == pair.menti; } @Override public int hashCode() { return Objects.hash(mento, menti); } } private static int refactor(int n, int m, int[][] arr) { Map<Pair, Integer> map = new HashMap<>(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { for (int k = j+1; k < n; k++) { Pair pair = new Pair(); pair.mento = arr[i][j]; pair.menti = arr[i][k]; map.put(pair, map.getOrDefault(pair, 1) + 1); } } } return (int) map.entrySet().stream().filter(entry -> entry.getValue() == m).count();; } }저는 위와 같이 짝에 부합하는 값들을 클래스를 통해 객체에 짝을 저장하고, 각 시험별 동일한 짝(객체)에 대한 중복을 제거함과 동시에 count값을 증가시키며 Map에 저장하는 방식으로 문제를 풀었습니다.
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
격자판 최대합 테스트케이스 문제 있습니다.
반대 누적합에 대한 테스트케이스 예외가 없는거 같아요.public static void main(String[] args) { Scanner sc = new Scanner(System.in); int length = sc.nextInt(); int[][] intArr = new int[length][length]; for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { intArr[i][j] = sc.nextInt(); } } System.out.println(answer(length, intArr)); } private static int answer(int length, int[][] intArr) { /* 대각선 누적합, 최대값 */ int xXSum = 0, xYSum = 0, max = 0; for (int i = 0; i < length; i++) { /* 행, 열 누적합 */ int rowSum = 0, colSum = 0; for (int j = 0; j < length; j++) { /* 각 행의 누적합 저장*/ rowSum += intArr[i][j]; /* 각 열의 누적합 저장*/ colSum += intArr[j][i]; } if (rowSum > max) max = rowSum; if (colSum > max) max = colSum; /* 대각선의 누적 합 저장*/ xXSum += intArr[i][i]; xYSum += intArr[length-1-i][length-1-i]; } /* 대각선 의 합 추가*/ if (xXSum > max) max = xXSum; if (xYSum > max) max = xYSum; return max; } }반대 대각선을 코드는 위 코드에서 바로 아래와 같습니다.xYSum += intArr[length-1-i][length-1-i];위에가 잘못 적용한 코드이고 (바로 위의 정대각선과 똑같은 작업을 하는것과 마찬가지입니다.)이것을 코딩채점사이트 상에 직접 돌려보면 정답으로 인정되지만 31 1 31 3 13 1 1이렇게 데이터 직접 넣어보면 9가 아닌 5가 최대값으로 출력됩니다.즉, 코딩채점에 반대 대각선에 대한 테스트케이스가 없다는 소리에요.xYSum += intArr[i][length-1-i];위 코드가 정답이고, 이렇게 했을때에는 처리가 되긴 되는데아무튼 현재 테스트케이스 상에 반대 대각선에 대한 누적합이 더 큰 경우가 없어서 처리가 안되고있습니다.그냥 반대 대각선 누적합 자체가 없는셈 치는거나 마찬가지에요
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
replaceAll, subString
안녕하세요 강사님, 강의 잘 듣고 있습니다. 지난 시간에 배운 replaceAll, subString로 풀어봤고 코드를 입력하면 정답이 잘 나오는데, 채점 사이트에서는 오답이라고 떠서요. 왜 그런지 설명해주실 수 있으실까요? 감사합니다~ import java.util.Arrays; import java.util.Scanner; class Main { public String solution(String str){ String answer= ""; str= str.replaceAll("[^\\d]+",""); for(int i=0; i<str.length(); i++){ if(str.charAt(i) == '0'){ answer = str.substring(i+1); } else return answer; } return answer; } public static void main(String[] args) { Main T = new Main(); Scanner sc= new Scanner(System.in); String str= sc.nextLine(); System.out.println(T.solution(str)); } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
공통원소구하기 시간초과관련
import java.util.*; public class Main { public List<Integer> solution(int n, int m, int[] x, int[] y) { List<Integer> answer = new ArrayList<>(); Map<Integer, Boolean> map = new HashMap<>(); for (int i = 0; i < n; i++) { map.put(x[i], true); } for (int i = 0; i < m; i++) { if (map.containsKey(y[i])) { answer.add(y[i]); } } //오름차순 정렬 Collections.sort(answer); return answer; } public static void main(String[] args) { Main t = new Main(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] x = new int[n]; for(int i = 0; i < n; i++){ x[i] = sc.nextInt(); } int m = sc.nextInt(); int[] y = new int[m]; for(int i = 0; i < m; i++){ y[i] = sc.nextInt(); } for(Integer i : t.solution(n,m,x,y)){ System.out.print(i+" "); } } }시간복잡도 신경 쓰다가 HashMap을 사용 해봤는데 그래도 아슬하게 세이프 인 것 같습니다... 혹시 제일 좋은 방법은 없을까요?
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
강의와는 다르게 해봤습니다.
import java.util.Scanner; public class Main { public String solutions(int target, int[] high) { String answer = ""; for (int i = 0; i < target; i++) { if (answer.isEmpty()) { answer += high[i]+" "; } else if (high[i]>high[i-1]) { answer += high[i]+" "; } } return answer; } public static void main(String[] args) { Main t = new Main(); Scanner sc = new Scanner(System.in); int target = sc.nextInt(); int[] high = new int[target]; for (int i = 0; i < target; i++) { high[i] = sc.nextInt(); } System.out.println(t.solutions(target, high)); } }강의 보기전에 혼자 이렇게 해봤는데 채점 정답처리는 받았습니다. 혹시 문제가 없을까요?
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
12번 멘토링 질문입니다!
안녕하세요, 12번 멘토링 문제 풀다가 첫 번째 채점 결과 값이 3으로 잘 나왔습니다. 그런데 그 다음 입력부터는 전부 오답이 나오는 상황인데, 어떤 부분에서 틀린 건지 알려주시면 감사하겠습니다 ㅠㅠ // package = " "; import java.io.*; import java.util.*; class Main { public int Solution(int n, int m, int arr[][]){ String mathMark = ""; ArrayList<Integer> ans = new ArrayList<>(); HashMap<String, Integer> countMap = new HashMap<>(); for(int i = 0; i < n; i++){ // 첫째부터 계속 다음 줄 내려가서 검사 for(int j = 0; j < m; j++){ // for(int k = 0; k < m; k++){ // System.out.println("j값 : "+j+", "+"k값 : "+k); if(j != k && j < k){ // System.out.println(arr[i][j]+", "+arr[i][k]); if(i == n-1 && j == m-1 && k == m-1){ mathMark += arr[i][j]+""+arr[i][k]; } else{ mathMark += arr[i][j]+""+arr[i][k]+" "; } } } } } /* m개 값을 가지고 있는 수 찾기 */ String numArray[] = mathMark.split(" "); // 숫자 등장 횟수 카운트 for(int i = 0; i < numArray.length; i++){ countMap.put(numArray[i],countMap.getOrDefault(numArray[i],0) + 1); } // 등장 횟수가 3 이상인 숫자 Count for(Map.Entry<String, Integer> entry : countMap.entrySet()){ System.out.println(entry.getKey()+" "+entry.getValue()); if(entry.getValue() == n){ ans.add(1); } } return ans.size(); } public static void main(String[] args) throws Exception{ Main m = new Main(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] numStr = br.readLine().split(" "); // 1. N과 M 입력받기 int column = Integer.parseInt(numStr[0]); int raw = Integer.parseInt(numStr[1]); int arr[][] = new int[raw][column]; for(int i = 0; i < raw; i++){ String[] test = br.readLine().split(" "); for(int j = 0; j < column; j++){ arr[i][j] = Integer.parseInt(test[j]); } } System.out.println(m.Solution(raw, column, arr)); br.close(); } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
10. 미로탐색 (DFS)
package Ex08; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ex10 { static int[][] arr; static int answer; public static void main(String[] args) throws IOException { ex10 T = new ex10(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); arr = new int[7][7]; for (int i = 0; i < 7; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); for (int j = 0; j < 7; j++) { int tmp = Integer.parseInt(st.nextToken()); arr[i][j] = tmp; } } T.DFS(0, 0); // 시작점을 (0, 0)으로 수정 System.out.println(answer); } public void DFS(int dx, int dy) { if (dx == 6 && dy == 6) { // 종료 조건 수정 answer++; } else { int[] dxs = {-1, 0, 1, 0}; // 위, 오른쪽, 아래, 왼쪽 순으로 이동 int[] dys = {0, 1, 0, -1}; for (int i = 0; i < 4; i++) { int x = dx + dxs[i]; int y = dy + dys[i]; if (x >= 0 && x < 7 && y >= 0 && y < 7) { if (arr[x][y] == 0){ arr[x][y] = 1; // 방문한 곳을 1로 표시 DFS(x, y); arr[x][y] = 0; // 백트래킹: 이전 상태로 돌아감 } } } } } }이 코드가 항상 정답값의 두배가 나오는데 어느 로직이 잘못된건지 모르겠습니다ㅠ
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
안녕하세요
import java.util.Scanner; public class lecture02 { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); String s=scanner.next(); char [] t=s.toCharArray(); String s1=""; System.out.println(); for (int i = 0; i < t.length; i++) { if(Character.isLowerCase(t[i])) { s1+=Character.toUpperCase(t[i]); } else if(Character.isUpperCase(t[i])) { s1+=Character.toLowerCase(t[i]); } } System.out.println(s1); } }이 코드가 정상적으로 구현한것 같은데 , 채점 사이트에서 컴파일 오류가 아닌 , 오답으로 처리 되고 있어서 어떤 부분이 잘못 된 것인지 궁금합니다 ( 예시 출력이나 몇개의 예시로는 올바르게 출력이 되는것 같아서 질문합니다)
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
11. 미로의 최단거리 통로(BFS)
dis L이라는 변수를 따로둬 배열 없이 풀어봤습니다. 일단 채점 사이트에는 정답으로 나왔는데 이렇게 풀어도 되는지 궁금해서 여쭤봅니다 ..미로가 막혀있다면 정답 직전까지 q.offer가 불가능해서 접근 불가능 하다고 생각 했습니다. 이럴 정답에 접근 불가니 -1를 리턴하면 된다고 생각했습니다. 더이상 누적되는 큐도 없으니 메소드도 끝난다고 생각 했습니다 .import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; class Pointer{ int x,y; public Pointer(int x, int y) { this.x = x; this.y = y; } } public class Main { static Scanner sc = new Scanner(System.in); static Main T = new Main(); static int[] dx = {-1, 0, 1, 0}; static int[] dy = {0, 1, 0, -1}; static int[][] miro; static int n; static int answer; public static void main(String[] args) { n = 7; miro = new int[n + 1][n + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { miro[i][j] = sc.nextInt(); } } miro[1][1] = 1; answer = T.searchMiro(1, 1); System.out.println(answer); } private int searchMiro(int x, int y) { Queue<Pointer> q = new LinkedList(); q.offer(new Pointer(x, y)); int L = 0; while (!q.isEmpty()) { int size = q.size(); for (int i = 0; i <size ; i++) { Pointer poll = q.poll(); for (int z = 0; z < 4; z++) { int nx = poll.x + dx[z]; int ny = poll.y + dy[z]; // 접근 가능하다면 바로 리턴 if (nx == n && ny == n) {return L + 1;} if (nx >= 1 && ny >= 1 && nx <= n && ny <= n && miro[nx][ny] == 0) { miro[nx][ny] = 1; q.offer(new Pointer(nx,ny)); } } } L++; } return -1; } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
안녕하세요. 코테 플랫폼 질문드립니다.
코드 제출하고 Submitting에서 넘어가지 않으면 시간초과인가요?
- 해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
크레인 인형뽑기 테스트 케이스
크레인 인형뽑기 테스트케이스 5번 잘못된거 아닌가요. 문제에는 바구니 아래부터 차곡차곡 쌓여있다고 되어 있는데 테스트 케이스는 인형 중간에 빈칸이 있네요.
- 해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
4. 단어 뒤집기 풀이방식 질문
선생님 안녕하세요. 풀이 방식에 질문이 있어 질문드립니다.선생님이 강의에서 풀어주신 방법과 다르게 저는 아래 코드처럼 작성을 했는데요. 저랑 풀이 방식이 크게 다른거 같아 제 풀이가 문제에서 원하는 풀이 방식이 아닌가 싶어 질문드립니다. 🙂 import java.util.Scanner; public class Main { // 문자열 뒤집는 메서드 public String solution(String str) { String answer = ""; char[] ch = str.toCharArray(); // 반복문 역순으로 돌리기 for (int i = ch.length - 1; i >= 0; i--) { answer += ch[i]; } return answer; } public static void main(String[] args) { Main main = new Main(); Scanner scanner = new Scanner(System.in); int number = scanner.nextInt(); while (number > 0) { System.out.println(main.solution(scanner.next())); number--; } } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
투포인터 슬라이딩 방식이 아니면 어떻게 구현해야 하나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 기존에 남겨주신 코드들 보면 합계를 이용해서 rt를 하나 증가시키고 lt도 합계에 따라 증가시키는 방식으로 이해습니다. 궁금한 부분이 lt에서 rt까지의 합이 아닌 lt와 rt 두 포인터의 합의 최소값으로 구현하려고 하니까 구현 방식이 greedy와 다를게 없어져서 어떻게 구현해야할지 잘 모르겠는데 어떻게 해야하나요? 현재 아래와 스니펫처럼 어떻게든 구현해보려고 하는데 구현하신 방식대로 하려고 하니 잘 풀리지 않습니다. for(int rt = 1; rt < arr.length; rt++){ sum = arr[lt] + arr[rt]; if(Math.abs(sum) < gap){ gap = Math.abs(sum); answer[0] = arr[lt]; answer[1] = arr[rt]; } while(lt + 1 < rt){ lt++; sum = arr[lt] + arr[rt]; if(Math.abs(sum) < gap){ gap = Math.abs(sum); answer[0] = arr[lt]; answer[1] = arr[rt]; } } lt++; }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
lt.rt가 잘 이해가 가지 않습니다.
tree.root.rt = new Node(3);tree객체에서 root를 참조하고, root 객체의 rt 변수의 값을 3으로 설정하는 것은 이해했습니다.그런데, tree.root.rt.lt는 rt변수에서 lt를 접근하는 건가요..??변수에서 변수를 참조하는 것이 잘 이해가 되지 않습니다.감사합니다.
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
채점 사이트에서 런타임 에러가 발생하여 질문드립니다.
강의보기전 짜본 코드입니다. 이클립스에서 실행할때는 답이 맞게 나오는데 채점 사이트에서는 에러가 출력되어 질문드립니다. package codingTest; import java.util.*; public class Main { public int Solution(int n, int[] ns) { int answer = 0; int reward = 0; for (int i = 0; i < n; i++) { if (ns[i] == 1) { reward++; answer += reward; } else if (ns[i] == 0) { reward = 0; answer += reward; } } return answer; } public static void main(String[] args) { // TODO Auto-generated method stub Main T = new Main(); Scanner kb = new Scanner(System.in); int n = kb.nextInt(); int[] ns = new int[n]; for (int i = 0; i < n; i++) { ns[i] = kb.nextInt(); } System.out.println(T.Solution(n, ns)); } }
- 미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
런타임에러라고 뜨는데 어디서 잘못된 걸까요?
board의 값을 map으로 저장했습니다. map<몇번째 칸, 저장된 인형들>map의 key에 해당하는 value는 stack으로 저장했습니다.찾아보니 테스트 케이스 5번이 N번 째 줄의 인형을 쌓을 때 0 0 0 1 2 3 이런 식으로 쌓이는 경우뿐 아니라 0 1 0 2 3 같은 경우도 있다고 하네요. 하지만 이건 문제에 따로 명시되지 않은 부분이고 보통 인형 쌓기라고 하면 공백 없이 차곡차곡 쌓이는 걸로 생각해서 코드를 짰습니다.위의 테스트 케이스를 제외하고는 그럼 통과가 돼야 하는데 아예 런타임에러로 뜨는 이유를 못 찾고 있습니다..어떤 문제 때문인지 알려주시면 감사하겠습니다!package programmers.level0; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Stack; import java.util.StringTokenizer; public class Main{ private static int solution(int size, int[][] board, int moveSize, int[] moves) { int answer = 0; // 삭제된 인형 수 Map<Integer, Stack<Integer>> map = new HashMap<>(); // 인형뽑기 기계(몇번째줄에 어떤 인형이 있는지 저장) // 입력받은 2차원 배열을 col별로 stack으로 저장해서 map에 저장 // 0값은 stack에 저장X for (int col = 1; col <= size; col++) { Stack<Integer> stack = new Stack<>(); for (int row = size; row > 0; row--) { if (board[row][col] == 0) break; stack.push(board[row][col]); } map.put(col, stack); } Stack<Integer> basket = new Stack<>(); for (int i = 0; i < moveSize; i++) { Stack<Integer> stack = map.get(moves[i]); if (!stack.isEmpty()) { if (!basket.isEmpty() && stack.peek() == basket.peek()) { basket.pop(); stack.pop(); answer += 2; } else { basket.push(stack.pop()); } } } return answer; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int size = Integer.parseInt(st.nextToken()); int[][] board = new int[size + 1][size + 1]; for (int i = 1; i <= size; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= size; j++) { board[i][j] = Integer.parseInt(st.nextToken()); } } int moveSize = Integer.parseInt(br.readLine()); int[] moves = new int[moveSize]; st = new StringTokenizer(br.readLine()); for (int i = 0; i < moveSize; i++) { moves[i] = Integer.parseInt(st.nextToken()); } System.out.println(solution(size, board, moveSize, moves)); } }