안녕하세요 문제에서 벽돌정보 순서대로 벽돌을 쌓아야 한다고 생각하고 문제를 풀었습니다. "최대 부분 증가수열" 문제와 유사하게 판단하고 비교 조건만 밑면사이즈와 무게 2개를 비교하는 조건으로 풀었습니다. 근데, 강좌를 들어보니 벽돌 정보 순서와 벽돌을 쌓는 순서는 상관없다는 설명이 없어서 좀 헷갈립니다. 혹시 어느 부분이 그런 의미를 포함하고 있나요? 코딩 문제는 아니고 문해력 질문이긴 합니다만, 문제를 잘 읽어야 코딩도 제대로 할수 있기때문에 질문 드립니다. 특히 "각 벽돌은 입력되는 순서대로 1부터연속적 인 번호를 가진다." 라는 문구가 입력순서를 기준으로 벽돌을 쌓아야하는것으로 이해해서 문제 설명 부탁드립니다.
강사님 답변을 보면 처음에 int pos=1000;을 설정하고서 for반복문과 if구문을 이용해서 거리를 찾는데요. int[] answer = new int[s.length()]; int p =1000; for(int i = 0; i<s.length(); i++) { if(s.charAt(i)==t) { p=0; answer[i] = p; } else { p++ answer[i] =p; } 이렇게 돼있습니다. 그런데 else에서 pos값은 처음 선언했던 1000인데 ++를 하면 1001이 되는 것 아닌가요? 그리고 궁금한점이 또 있습니다. taechermode이런 문자가 있다고 하고 e와의 거리를 찾는다고 하면 answer[0]은 2가 나와야 하는데 저 식에서는 1이 나오지 않나요?(pos가 0이라고 가정할 때) 제가 잘못생각하는건지... 오류가 있다면 알려주세요
public void 최대점수구하기 (int L, int score, int time, ArrayList<Score> arr) { // c = 주어진 시간 (20분), n 은 주어진 문제의 갯수 if (time > maxTime ) return; if (L == quizNums ) { answer += Math. max (score ,arr.get(L).score); } else { 최대점수구하기(L + 1, score + arr.get(L).score, time + arr.get(L).time, arr); 최대점수구하기(L + 1, score, time, arr); } } 이렇게 2개의 배열을 넘겨주는 대신 객체를 리스트에 담아서 사용하는건 어떤가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. http://boj.kr/2b3465bfb212482695e3993e7f8ba7f0 탑다운으로도 풀어보고 싶어서 시도해봤으나 실패했습니다. 로직에 이상이 있는 것인지, 반례는 어떤 것인지 파악하는 것에 어려움을 겪고 있어 질문 드립니다. 항상 감사합니다!
안녕하세요. 선생님 강의 정말 잘 보고 있습니다. 저는 for문으로 4개의 합을 한꺼번에 계산했는데 시간복잡도는 O(n^2)로 같으니 괜찮은걸까요? 그리고 알고리즘 공부가 처음이라 시간복잡도를 구글링해서 찾아봤는데.. 원래 강의에서 따로 설명하는 부분이 없는건지 아니면 진도가 좀 더 나가야 설명해주시는건지 궁금합니다~ (split해서 자르지않고 바로 2차배열로 저장할 수 있네요.. 스캐너 메소드를 좀 더 공부해야겠습니다.) public class INF0209 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); int[][] grid = new int[n][n]; for (int i = 0; i < n; i++) { String s = sc.nextLine(); String[] split = s.split(" "); for (int j = 0; j < n; j++) { grid[i][j] = Integer.parseInt(split[j]); } } INF0209 inf = new INF0209(); System.out.println(inf.solution(grid, n)); } public int solution(int[][] grid, int n) { int max = 0; for (int i = 0; i < n; i++) { int[] sums = new int[4]; for (int j = 0; j < n; j++) { sums[0] += grid[i][j]; sums[1] += grid[j][i]; sums[2] += grid[j][j]; sums[3] += grid[j][n-j-1]; } //최댓값 구하기 for (int sum : sums) { if(sum > max) { max = sum; } } } return max; } }
선생님 안녕하세요! 일단 너무 훌륭한 강의 준비 해주셔서 감사합니다! 너무 많은 도움이 되고 있습니다. 제가 섹션 5까지는 혼자서 문제도 풀고 이해도 되는데 섹션 6에 재귀함수 시작하고 나서 부터 문제 풀이가 너무 힘들어졌습니다. 원래 계획 했던 방법은 처음 부터 끝까지 다 완강한 후 제 힘으로 못 풀었던 문제들 다시 섹션 1부터 풀 계획이었는데 섹션 6을 완전히 이해 못한채 다음 섹션을 가는게 맞는 것일지 모르겠습니다. 일단 먼저 완강을 한 후 다시 처음부터 가는게 맞을까요? 아니면 섹션 1부터 섹션 5를 완벽히 다진 후 섹션 6-7을 가는게 맞을까요? 두서 없지만 답답해서 여쭤봅니다! 감사합니다!
저는 string이 아니라 char[] 로 받아서 만들어 봤는데 왜 틀렸는지 잘 모르겠습니다 ㅠㅠ #include <bits/stdc++.h> using namespace std; int alphabet[26]; char input[100]; int main() { cin >> input; // a -> 97 for (int i = 0; input[i] != '\0'; ++i) alphabet[(int)input[i] - 97]++; for (int i = 0; i < 26; ++i) cout << alphabet[i] << " "; return 0; }
혼자 풀다가 막힌 문제인데 어떻게 풀어야 할지 몰라서 질문드립니다. 문제를 간략하게 설명하면, 문제가 n*n행렬이 나오는데 (0,0)에서 사람이 움직이는데, 움직이는 조건이 왼손을 터치할 수 있는 방향으로만 움직일 수 있습니다. (0,0)에서 (n-1,n-1)로 나가는 경로의 길이를 구하라. 입니다. 만약 s에서 e로 간다면 답이 12가지 입니다. s가 사람 모양이고 왼손을 터치할 수 있는 곳만 움직일 수 있습니다. 레벨탐색으로 하면서 큐를 잡는데 Queue<int[]> q = new LinkedList<>(); q.add(new int[] {x,y,1}); // x와y는 좌표, 1은 왼손을 터치할 수 있다는 표시로 풀려고 했는데 풀리지 않았습니다. 솔루션이 궁금합니다.
안녕하세요 큰돌 선생님 문제를 풀다가 막혀서 질문드립니다. 전체적인 로직은 선생님 코드와 비슷한것 같은데 29점에서 막힙니다. http://boj.kr/d71d2395bc9b4b61ad8153b14682dc35 저는 구조체를 만들지 않고 그냥 배열 4개를 만들어서 따로 값을 저장했습니다. 29점이 나오는데, N이 20을 넘어갔을때 런타임 에러에 걸립니다. 인덱스 참조할때 배열을 범위를 넘어가는 부분도 없는것 같고, 0으로 나누거나 그러지도 않았는데 혹시 어떤 부분이 잘못된것일까요?
선생님 안녕하세요! 강의 잘 듣고 있습니다 !! 코딩 스타일에 대해서 질문이 있습니다. 선생님 강의를 보니 map[30][30], ch[30]와 같이 선언을 주로 하시는것 같습니다. 하지만 문제에서는 정점의 수 범위가 최대 20이라서 30까지 필요해보이지는 않아서요. 제가 아직 코딩테스트를 한번도 본 적이 없어서 잘 모릅니다. 회사를 다니면서 최대한 효율적으로 코드를 작성하다보니 요구사항에 맞는 크기로 사용하는 버릇이 있네요. 문제에 맞는 범위의 배열을 선언하고, 그래프 정점이 1 -> 2로 간다면, 선생님은 인덱스 번호를 1로 맞추시는데, 0은 사용하지 않고 낭비됩니다. 이런 사항은 코딩테스트에서 신경쓰지 않아도 될까요? 단순히 문제 해결을 위해 위 사항쯤은 무시하고 편하게 코딩해도 되는지 궁금합니다 !! #include <iostream> #include <vector> using namespace std; static vector<vector<int>> graph; static vector<bool> visited; static int minCost = INT_MAX; int N; void DFS(int v = 0, int cost = 0) { // v에 방문 visited[v] = true; // 지금까지 누적된 비용이 min보다 높다면 리턴 if (cost > minCost) return; // 목적징에 도착 if (v == N - 1) minCost = minCost > cost ? cost : minCost; else for (int i = 0; i < N; ++i) if (!visited[i] && graph[v][i] >= 0) { // v에 방문하기 DFS(i, cost + graph[v][i]); visited[i] = false; } } int main() { int M; scanf_s("%d %d", &N, &M); graph = vector<vector<int>>(N, vector<int>(N, -1)); visited = vector<bool>(N, false); int f, t, c; // from, to, cost for (int i = 0; i < M; ++i) { scanf_s("%d %d %d", &f, &t, &c); graph[f - 1][t - 1] = c; } DFS(); printf("%d", minCost); }
int check(int temp, vector<int> &v) // vector<int> v 로 쓸 때 다른 부분은 블로그에 있는 코드와 동일하게 작성하고 check 함수의 매개변수 부분에서 vector<int> &v를 vector<int> v로 바꿔서 쓰면 답은 동일하게 나오는데 시간 초과가 나와서 틀리게 됩니다. 왜 시간이 더 길어지는지 알고 싶습니다.
#include <bits/stdc++.h> using namespace std; // 난쟁이 9명 int dwarf[9]; int main() { int sum = 0; // 입력받기 & 총 합 구하기 for (int i = 0; i < 9; i++) { cin >> dwarf[i]; sum += dwarf[i]; } // 7난쟁이가 아닌 2명의 합 int remain = sum - 100; // 배열에서 2명의 합이 remain인지 확인하기 for(int i = 0; i < 8; i++) for(int j = i + 1; j < 9; j++) if (remain == (dwarf[i] + dwarf[j])) { dwarf[i] = INT32_MAX; dwarf[j] = INT32_MAX; break; } // 정렬하기 sort(dwarf, dwarf + 9); // 출력 for (int i = 0; i < 7; i++) cout << dwarf[i] << '\n'; } 난쟁이가 아닌 얘들에게 INTMAX 값을 넣고 SORT 시켰는데 왜 이 코드가 계속 틀렸다고 나오는지 잘 모르겠습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님! 강의를 듣고있는데 드디어 문제의 강의를 들을 차례인데 먼저 제가 풀어보고 듣는게 나은지 아니면 그냥 일단 강의를 듣는지 잘 모르겠어서 질문 남겨요! 그리고 강의 교안을 혼자 계속 공부를 따로 해야하는지 부분도 궁금합니다!
http://boj.kr/950a82ed51544ab2afcab679ab16ca02 안녕하세요 강사님 제가 작성한 코드인데 강사님이 설명해주신 부분과 차이가 있는 부분이 있어서 질문올립니다. 첫 번째 질문 저는 재귀함수를 작성할 때 하위함수를 무조건 호출하고, 가장 하위함수의 결과부터 시작해서 올라오는 방식으로 코드를 짰습니다. 이런 방식을 분할 정복이라고 할 수 있는건가요? 두 번째 질문 위의 방식으로 코드를 작성하기 위해서 시작 지점을 범위의 우측 하단으로 설정했습니다. 그래서 맨 처음 재귀함수를 호출할 때, N을 시작 지점으로 입력받게 됩니다. 이 부분은 잘 처리한건가요?