- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강의 잘 듣고 있습니다. 문제와 관련 없긴 한데, 궁금해서 질문 드립니다. 동일한 코드의 메서드 solution1, solution2를 main 메서드에서 순차적으로 실행했을 때 결과값이 다른데, 스택이 멀티쓰레드에 안전하지 않아서 발생하는 문제일까요? 하나씩 실행하면 올바른 정답이 나옵니다. package 스택; import java.util.Scanner; import java.util.Stack; public class _03_크레인인형뽑기 { public int solution1(int[][] board, int[] moves) { int answer = 0; Stack<Integer> stack = new Stack<>(); for (int pos : moves) { for (int i = 0; i < board.length; i++) { if (board[i][pos - 1] != 0) { int tmp = board[i][pos - 1]; board[i][pos - 1] = 0; if (!stack.isEmpty() && (stack.peek() == tmp)) { stack.pop(); answer += 2; } else { stack.push(tmp); } break; } } } return answer; } public int solution2(int[][] board, int[] moves) { int answer = 0; Stack<Integer> stack = new Stack<>(); // 1. 크레인 위치에 해당하는 인형을 찾는다. (밑으로 행을 이동하면서 인형 찾기) for (int pos : moves) { for (int i = 0; i < board.length; i++) { // 2. 비어 있지 않은 인형 캐치 (배열의 index는 0부터 시작하기 때문에 -1) if (board[i][pos - 1] != 0) { // 인형 꺼냄 int tmp = board[i][pos - 1]; // board의 인형은 비어줌 board[i][pos - 1] = 0; // 바구니에 겹치는게 있으면 모두 꺼냄 if (!stack.isEmpty() && (stack.peek() == tmp)) { stack.pop(); answer += 2; } else { // 아니면 바구니에 인형 담기 stack.push(tmp); } // 다음 위치로 이동 break; } } } return answer; } public static void main(String[] args) { _03_크레인인형뽑기 t = new _03_크레인인형뽑기(); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] board = new int[n][n]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { board[i][j] = sc.nextInt(); } } int m = sc.nextInt(); int[] moves = new int[m]; for (int i = 0; i < m; i++) { moves[i] = sc.nextInt(); } System.out.println("1번 : " + t.solution1(board, moves)); System.out.println("2번 : " + t.solution2(board, moves)); } } 결과값 5 0 0 0 0 0 0 0 1 0 3 0 2 5 0 1 4 2 4 4 2 3 5 1 3 1 8 1 5 3 5 1 2 1 4 1번 : 4 2번 : 0
http://boj.kr/b4b633fb25634805a58a4d335d3e209b 제가 작성한 코드입니다. 해설에있는 방법과는 다르게 코드를 짰지만 제가 작성한코드도 예제 입력시 모두 정답이 나오는데 제출을 하면 틀렸다고 합니다. 반례를 찾으려고 오래 붙잡고있었는데 도저히 생각이 안나요ㅜㅜ 도와주세요!! 항상 강의와 유튜브 잘 보고 있습니다! 감사합니다!
선생님 안녕하세요 ~ 미로탐색(DFS) 문제를 BFS로 풀어보고 싶은데 어떻게 풀어줘야 문제가 해결 될까요?? 지나온 길을 체크한 후 BFS에서는 체크를 어떻게 풀어줘야할지 모르겠습니다.. function solution(arr) { let answer = 0; let n = arr.length - 1; let nx = [-1, 0, 1, 0]; let ny = [0, 1, 0, -1]; let queue = []; queue.push([0, 0]); while (queue.length) { let [x, y] = queue.shift(); for (let k = 0; k < 4; k++) { let dx = x + nx[k]; let dy = y + ny[k]; if (dx === n && dy === n) answer++; if (dx >= 0 && dx <= n && dy >= 0 && dy <= n && arr[dx][dy] === 0) { arr[x][y] = 1; queue.push([dx, dy]); } } } return answer; }
안녕하세요 선생님! 프로그래머스에서 코딩 기초 트레이닝 0단계를 모두 풀고나서 수강 중인 학생입니다. 제가 문제를 풀고나서 강의를 보고 코드를 비교하면서 리뷰도 진행하면서 느낀 의문이 있습니다. 저는 프로그래머스에서 algorithm과 같은 라이브러리를 활용해서 문제를 많이 풀었는데 선생님 강의에서는 그 라이브러리의 원리를 풀어서 푸는 문제가 많더라구요! 모든 코딩에는 정답이 없겠지만 코딩테스트에서 활용해도 무방한지 궁금합니다 ㅎㅎ
안녕하십니까 큰돌님 강의 보기 전에 코드 작성했는데 저는 지울 노드가 주워졌을 때 진짜 없애는 코드를 작성했었는데 틀렸더라구요. 어디가 틀렸을까요 ?? http://boj.kr/7a0241561d4f4fcc9c6a10d8f190da42 +커뮤니티에서 반례를 찾았습니다 2 1 -1 1 답 : 0 / 제 코드 : 1 추가로 궁금한게 저 반례의 경우 그림이 어떻게 되는 건지 모르겠습니다 + 그리고 다른 질문 중에서 ""트리가(루트노드가) 단 하나만 존재해야 하는데 문제에서는 트리가 반드시 하나만 존재한다는 설명이 안보인다 3 -1 -1 -1 1 답 : 2"" 라는 질문이 있는데 만약에 저렇게 주어졌을 때 저는 답이 3이라고 생각하는데 2인 건가요 ?? 저 상황에서의 그림 또한 궁금합니다
이렇게 작성하니까 오류가 나는데 뭐가 잘못된건지 모르겠습니다. import java.util.*; import javax.security.auth.Subject; import java.awt.List; import java.io.*; class Main { public static int[]dy; public int solution(String s){ int answer = 0; dy = new int[101]; answer = dfs(0,s); return answer; } public static int dfs(int s, String str) { if(dy[s]>0) return dy[s]; if(str.charAt(s)=='0' && s<str.length()) return 0; if(s==str.length() || s==str.length()-1) return 1; else { int res = dfs(s+1, str); int num = Integer.parseInt(str.substring(s,s+2)); if(num<=26) res+=dfs(s+2, str); return dy[s] = res; } } public static void main(String[] args){ Main T = new Main(); System.out.println(T.solution("25114")); System.out.println(T.solution("23251232")); System.out.println(T.solution("21020132")); System.out.println(T.solution("21350")); System.out.println(T.solution("120225")); System.out.println(T.solution("232012521")); } }
안녕하세요 선생님 좋은강의 감사합니다. 강의를 보고 코드를 작성하던중에 질문이 생겼습니다. 강의속 코드에서 turn = 1로 초기화 하고 b 에다가 turn을 더하는 방식으로 코드를 작성하셨는데 turn = 0 으로 초기화 하고, 이에 맞게 코드를 재작성하니 원하는 답이 나오지 않아서 질문 드립니다. 우선 테스트케이트 17, 5 를 입력했을때 4가 아니라 6이 나와서 애초에 틀렸기 때문에 코드를 백준에 제출하지 않았습니다. 따라서 링크가 아닌 질문에 제가 작성한 코드를 첨부하겠습니다. #include <bits/stdc++.h> using namespace std; int N, K, visited[2][500005]; bool flag; int bfs(int N, int K) { int turn = 1; queue<int> q; q.push(N); visited[0][N] = 1; while (q.size()) { K += turn; if (K >= 500001) return -1; if (visited[turn % 2][K]) { flag = 1; return turn; } int qsize = q.size(); for (int i = 0; i < qsize; i++) { int here = q.front(); q.pop(); if (here == K) { flag = 1; return turn; } for (int there : {here + 1, here - 1, here * 2}) { if (there < 0 || there >= 500001) continue; if (visited[turn % 2][there]) continue; visited[turn % 2][there] = visited[(turn + 1) % 2][here] + 1; q.push(there); } } turn++; } return -1; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> K; int res = bfs(N, K); if (flag) cout << res << '\n'; else cout << - 1 << '\n'; return 0; }
http://boj.kr/b99b5a5fdbd244e797ca23eca42b1662 *설명은 주석해놓았습니다. 강의를 듣기 전에 먼저 짜본 코드인데 모든 입력 값에 대해서 is not acceptable만 출력되는 오류가 발생하는 코드입니다. 큰돌님 코드랑 비교했을 때 전체적인 로직은 다를 바가 없다고 보이는데, 어디가 잘못된건지 짚어주시면 감사하겠습니다.ㅠ
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1) int n = kb.nextInt(); String str = kb.nextLine(); ============================== 2) int n = kb.nextInt(); String str = kb.next (); 1)과 2) 차이점이 궁금합니다. 예를들어 5 \r\n 3 을 입력하는 경우, 1)의 경우에는 콘솔창에 엔터를 치면 입력이 안되고, 2)의 경우에는 엔터를 쳐서 따로 입력이 가능한데 왜 그런지 궁금합니다ㅠㅠ
성역에서 시간을 보내다보니 2주째 손을 놓아버렸네요 다시빡공갑니다 좌표탐색할때 좌표평면이 저희가 평소알던게아니라 y가 뒤집어져있어서 헷갈리는데 const int dy[] = {-1,0,-,0}; const int dx[] = {0,1,0,-1}; 가 아니라 const int dy[] = {1,0,-1,0}; const int dx[] = {0,1,0,-1}; 으로해도 답은 맞게나오던데 상관없나요?
다음과 같이 코드를 작성했는데, 테스트케이스 4, 5번이 틀린 것으로 나오네요. 제 코드에 어떤 문제가 있는지 이해가 되지 않아서 질문 드립니다. import java.util.*; import java.io.*; public class Main { public int solution(int[][] board, int[] moves) { int answer = 0; List<Integer> dollList = new ArrayList<>(); Stack<Integer> stack = new Stack<>(); for (int i = 0; i < moves.length; i++) { stack = new Stack<>(); for (int j = 0; j < board.length; j++) { if (board[j][moves[i] - 1] != 0) { stack.push(board[j][moves[i] - 1]); board[j][moves[i] - 1] = 0; break; } } if (stack.isEmpty()) { continue; } dollList.add(stack.pop()); // 바구니에 인형을 넣음 if (dollList.size() >= 2) { for (int j = 0; j < dollList.size() - 1; j++) { if (dollList.get(j) == dollList.get(j + 1)) { dollList.remove(dollList.get(j)); dollList.remove(dollList.get(j)); answer += 2; } } } } return answer; } public static void main(String[] args) throws IOException { Main main = new Main(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[][] board = new int[n][n]; for (int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); for (int j = 0; j < n; j++) { board[i][j] = Integer.parseInt(st.nextToken()); } } int m = Integer.parseInt(br.readLine()); int[] moves = new int[m]; StringTokenizer st = new StringTokenizer(br.readLine()); for (int i = 0; i < m; i++) { moves[i] = Integer.parseInt(st.nextToken()); } System.out.println(main.solution(board, moves)); } }