- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님 이번에 처음 구매했는데, 공부순서를 어떻게 하면 좋을까요 ? 교안을 먼저 보고 교안에 있는 내용들을 충분히 숙지한 후에 동영상강의를 듣는게 맞을까요? 그리고 저는 C를 어느정도 공부한 후 C++은 문법만 살짝 맛봤는데, 강의 내용이 처음부터 알고리즘에 관한 내용이 나와서 어려운 부분이 꽤 많습니다 ㅠㅠ 추천해주실만한 공부순서 있으면 부탁드립니다.
예전 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) ); } }
심화>최적화(재귀, 백트래킹의 경우의 수) 강의 4번문제를 풀었는데, 백준에 제출하면 계속 시간초과가 뜨네요..! import sys sys.setrecursionlimit(10**6) input = sys.stdin.readline n, k = map(int, input().split()) stuff = [list(map(int, input().split())) for _ in range(n)] value = 0 def recur(idx, tw, tv): global value if tw > k: # 무게 초과 return if idx == n: value = max(value, tv) return recur(idx+1, tw+stuff[idx][0], tv+stuff[idx][1]) recur(idx+1, tw, tv) recur(0, 0, 0) print(value) 수업자료를 참고하고 싶은데, mp4로 올라와있어서 질문 남깁니다. 시간초과를 어떻게 하면 피할 수 있을까요?
안녕하세요 선생님. 강의 잘 보고 있습니다. 다름이 아니라 배낭 문제 바텀업DP가 이해가 안가서 질문남깁니다. 지금까지 DP 설명하실때는 모두 끝에서 부터 얘기를 해주셔서 퇴사 문제에서는 뒤에서부터 앞으로 오는식은 이해가 갔는데 배낭은 왜 앞에서부터 시작을 해야하는지 이해가 잘 안가서 질문 남깁니다. 배낭도 뒤에서 앞으로 오는 식으로 풀 수 있을까요?
#include <bits/stdc++.h> using namespace std; int R, C, fire_visitied[1000][1000]={0,}, jihoon_visitied[1000][1000]={0,}; int dy[4]={-1,0,1,0}, dx[4]={0,1,0,-1}; char arr[1000][1000]={0,}; pair<int,int> jihoon, fire; vector<pair<int,int>> fire_v; void fire_bfs(int y, int x){ queue<pair<int,int>> que; fire_visitied[y][x]=1; que.push({y,x}); while(que.size()){ pair<int,int> temp=que.front(); que.pop(); for (int i=0;i<4;i++){ int ny=temp.first+dy[i]; int nx=temp.second+dx[i]; if (ny<0||nx<0||ny>=R||nx>=C) continue; if (arr[ny][nx]=='#'||(fire_visitied[ny][nx]&&(fire_visitied[ny][nx]<fire_visitied[temp.first][temp.second]+1))) continue; fire_visitied[ny][nx]=fire_visitied[temp.first][temp.second]+1; que.push({ny,nx}); } } } int jihoon_bfs(int y, int x){ queue<pair<int,int>> que; jihoon_visitied[y][x]=1; que.push({y,x}); while(que.size()){ pair<int,int> temp=que.front(); que.pop(); for (int i=0;i<4;i++){ int ny=temp.first+dy[i]; int nx=temp.second+dx[i]; if (ny<0||nx<0||ny>=R||nx>=C) return jihoon_visitied[temp.first][temp.second]; if (jihoon_visitied[ny][nx]||arr[ny][nx]=='#') continue; if (jihoon_visitied[temp.first][temp.second]+1>=fire_visitied[ny][nx]) continue; jihoon_visitied[ny][nx]=jihoon_visitied[temp.first][temp.second]+1; que.push({ny,nx}); } } return 0; } int main() { cin >> R >> C; for (int i=0;i<R;i++){ for (int j=0;j<C;j++){ cin >> arr[i][j]; if (arr[i][j]=='J') jihoon={i,j}; if (arr[i][j]=='F') fire_v.push_back({i,j}); } } if (!fire_v.size()) fill(&fire_visitied[0][0],&fire_visitied[0][0]+1000*1000,INT_MAX); for (auto i:fire_v) fire_bfs(i.first,i.second); int answer=jihoon_bfs(jihoon.first,jihoon.second); if (answer) cout << answer; else cout << "IMPOSSIBLE"; } 위 코드에서 메모리 초과가 납니다. 초기의 모든 불의 위치를 큐에 담아서 bfs 를 하는 것을 생각하지 못해 모든 불을 돌면서 bfs를 하도록 코딩했습니다. if (arr[ny][nx]=='#'||(fire_visitied[ny][nx]&&(fire_visitied[ny][nx]<fire_visitied[temp.first][temp.second]+1))) continue; 이 라인을 통해서 fire 배열의 중복을 막은 것 같은데 왜 메모리초과가 나는지 모르겠습니다. 알려주시면 감사하겠습니다 ㅠ
dfs 방식으로 풀었는데 메모리초과가 발생해 질문드립니다. 재귀함수이다보니 함수호출이 잦아 발생하는거 같은데, 해당 위치에서, 해당 위치에 도달하는 경로 중 가장 많이 이동한 경로만을 탐색하는 방식으로 진행했음에도 불구하고 메모리초과가 발생하다보니 어디가 문제인지 모르겠어서 질문드립니다 ㅜㅜ... #include <bits/stdc++.h> using namespace std; enum { E, S, W, N, }; // moves : 해당 위치에 도착했을 때, 지금까지 내가 몇번 움직였는지를 저장한다. int table[51][51], moves[51][51]; int n, m; int dy[4] = {0,1,0,-1}, dx[4] = {1,0,-1,0}; // dfs, 이동 가능한 방향으로 이동하는 함수 void go(int fy, int fx, int y, int x, int cnt) { // 움직인 횟수 저장 moves[y][x] = cnt; for(int i = E; i < N; i++) { int ny = y + dy[i]*table[y][x], nx = x + dx[i]*table[y][x]; // 최대 횟수로 이동한 경로만 통과 가능 if(ny < 0 || nx < 0 || ny >= n || nx >= m || table[ny][nx] == 0 || cnt + 1 < moves[ny][nx]) continue; // 무한 루프에 빠지게 될 경우, 탈출 if(fy == ny && fx == nx) { exit(0); } go(y, x, ny,nx, cnt + 1); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { char tmp; cin >> tmp; if(tmp == 'H') { tmp = '0'; } table[i][j] = tmp - '0'; } } go(0,0,0,0,1); cout << *max_element(moves[0], moves[0] + 51*51); return 0; }
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 자바로 작성했는데, 시간 초과가 납니다. 어느 부분이 잘 못 작성한건지 궁금합니다. import java.io.*; import java.util.*; class Node implements Comparable<Node>{ int idx; char team; int power; Node(int idx, char team, int power){ this.idx = idx; this.team =team; this.power = power; } @Override public int compareTo(Node o) { return this.power - o.power; } } public class Main { public static void main(String[] argvs) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int[] answer = new int[n+1]; ArrayList<Node> list = new ArrayList<>(); for(int i=1; i<=n; i++) { char a = sc.next().charAt(0); int b=sc.nextInt(); list.add(new Node(i,a,b)); } Collections.sort(list); //정렬 HashMap<Character, Integer> map = new HashMap<>(); int j=0,total=0; for(int i=1; i<n; i++) { for(;j<n; j++) { if(list.get(j).power<list.get(i).power) { total+=list.get(j).power; //쫓아오는 학생의 파워를 누적합 char x =list.get(j).team; //쫓아오는 학생의 팀을 표시 map.put(x, map.getOrDefault(x, 0)+list.get(j).power); //해싱해준다. } else break; } answer[list.get(i).idx] = total - map.getOrDefault(list.get(i).team, 0); //전체 누적합에서 자신의 팀이 있다면 그 점수는 빼준다. } for(int i=1; i<=n; i++) System.out.println(answer[i]); } }
안녕하세요 선생님 😃 누적합 관련해서 질문있습니다. 아래 글은 이전에 누적합 관련해서 이러한 로직을 사용하는 것은 어떤지 질문을 드렸던 글입니다. https://www.inflearn.com/questions/1233619/1%EC%A3%BC%EC%B0%A8-%EA%B0%9C%EB%85%90-9-%EB%88%84%EC%A0%81%ED%95%A9-%EC%A7%88%EB%AC%B8%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4 위의 로직을 사용해서도 문제를 풀어봤는데요, 테스트 케이스에서는 정답이었지만, 백준에 제출했을 때는 오답처리가 되어 무엇이 잘못된 것인지 잘 모르겠어서 질문드립니다. http://boj.kr/e912454a40e7424d98eccf86d7506db2
안녕하세요 선생님 :) 선생님께서 푸신 풀이에서 하나를 입력하면 그에 대한 출력이 바로 나오는 것이 마음에 들지 않아서 모든 입력을 넣어야 출력이 나오도록 코드를 변경해보려고 했습니다. vector 컨테이너를 사용해서 입력된 문자열들을 컨테이너에 담고, 인덱스에 알맞는 문자열을 꺼내와서 DA인지 NE인지 출력해보려고 했는데요, 자꾸 vector out of range 에러가 나옵니다. 왜 범위를 벗어난건지 모르겠어서 질문드립니다 ㅠㅠ http://boj.kr/bc2da3a3773c401086b47cf818e8c0f1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 자바로 작성해서 예제는 맞게 나오는데, 제출하니까 틀렸다고 나옵니다. 어디가 잘못 된걸까요?? import java.io.*; import java.util.*; public class Main { public static void main(String[] argvs) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int[] num = new int[n+1]; int[] st = new int[n+1]; for(int i=1; i<=n; i++)num[i]=sc.nextInt(); int k=sc.nextInt(); for(int i=1; i<=n; i++) st[i] = num[i]; Arrays.sort(st); int rest=num.length; //처리해야 할 작업 개수 for(int i=1; i<st.length; i++) { long time=((long) rest * (st[i] - st[i-1])); //몇번의 회전에 해당 작업이 끝나는가 if(time>k) { long idx= k%rest; //어디서 멈춰야하는지 구하는 변수 int cnt=0; for(int j=0; j<num.length; j++) { if(num[j]>=st[i]) { if(cnt==idx) { System.out.print(j); System.exit(0); } cnt++; } } } else { k-=time; rest--; } } System.out.print(-1); } }
강사님! 20 팩토리얼에 2가 몇 번 곱해져있는지 설명해주시는 부분에서 질문이 있습니다. 마지막에 20을 2의 제곱수로 나눴을 때 몫의 정수 부분 합이 2가 몇 번 곱해져 있는지 나타내는 수라고 알려주셨는데요. 이게 어떤 원리인지 궁금합니다. 그러니까 수학적으로 왜 이렇게 같을 수 있는지 알고싶어요!