묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
7-T 1학년, dp 배열의 초기화 관련
안녕하세요 큰돌님 1학년 문제를 풀었는데, dp배열 초기화의 유무에 따라 답이 갈립니다. 저는 0이라는 값도 결과값이 될 수 있는 값 중 하나라고 생각하여 dp배열을 -1로 초기화했습니다. 그런데 이런 경우 답이 틀렸다고 나옵니다.오히려, fill을 이용한 별도의 초기화 없이 기본적은 0으로 상태를 두면 맞다고 나옵니다.제가 어떤 점을 잘못 생각한건가요?감사합니다.소스코드 : http://boj.kr/aaa7dca582ec4827803e5b5826b6cdb5
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5 - O : 17406 질문 있습니다
구현하고 예제 및 반례를 넣어보고 디버깅도 나름 해봤는데 도저히 틀린 점을 못 찾겠습니다. 강의와 접근 방식이 조금 다르지만 비슷한 것 같은데 어떤 점에서 틀린 건지 알려주시면 감사할 것 같습니다 ㅠㅠ#include <bits/stdc++.h> using namespace std; int N, M, K, mp[51][51], temp_mp[51][51], ret=INT_MAX; vector<vector<int>> v; vector<int> choose_v; int visitied[10]={0,}; int dy[4]={1,0,-1,0}, dx[4]={0,1,0,-1}; void rotate(int y,int x,int sz){ for (int i=1;i<=sz;i++){ int start_y=y-i; int start_x=x-i; int start_val=temp_mp[start_y][start_x]; int temp_y=start_y; int temp_x=start_x; for (int j=0;j<4;j++){ int rotate_flag=i*2; while(rotate_flag--){ // printf("%d,%d ",temp_y,temp_x); temp_mp[temp_y][temp_x]=temp_mp[temp_y+dy[j]][temp_x+dx[j]]; temp_y+=dy[j]; temp_x+=dx[j]; } //printf("\n"); } temp_mp[start_y][start_x+1]=start_val; } } void choose(int sz,vector<int> &_choose_v){ // printf("sz: %d\n",sz); // for (int&i:_choose_v){ // printf("%d ",i); // } // printf("\n"); // printf("%d %d\n",visitied[0],visitied[1]); if (sz==K){ for (int i=1;i<=N;i++){ for (int j=1;j<=M;j++){ temp_mp[i][j]=mp[i][j]; } } for (int i=0;i<10;i++){ visitied[i]=0; } for (int&i:_choose_v){ rotate(v[i][0],v[i][1],v[i][2]); for (int j=1;j<=N;j++){ int sum=0; for (int k=1;k<=M;k++){ sum+=temp_mp[j][k]; } if (sum<ret){ ret=sum; } } } //printf("\n"); return; } for (int i=0;i<K;i++){ if (find(_choose_v.begin(),_choose_v.end(),i)==_choose_v.end()){ _choose_v.push_back(i); visitied[i]=1; choose(sz+1,_choose_v); visitied[i]=0; _choose_v.pop_back(); } } } int main() { cin >> N >> M >> K; for (int i=1;i<N+1;i++){ for (int j=1;j<M+1;j++){ cin >> mp[i][j]; } } for (int i=0;i<K;i++){ vector<int> temp_v; for (int j=0;j<3;j++){ int temp; cin >> temp; temp_v.push_back(temp); } v.push_back(temp_v); } choose(0,choose_v); // for (int i=1;i<N+1;i++){ // for (int j=1;j<M+1;j++){ // printf("%d ",temp_mp[i][j]); // } // printf("\n"); // } cout << ret; }choose()함수를 통해 순열을 만들고 choose()의 인자인 sz가 K가 되면, 순열의 순서에 맞게 rotate한 후 최솟값을 찾을 수 있도록 작성했습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1940 주몽 문제 메모리 초과 질문있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. https://www.acmicpc.net/source/share/f81085fda0c842898c7f440cecb12d4e 안녕하세요. 선생님 제가 선생님 풀이를 보기전에는 이렇게 2차원 배열을 통해서 구간별 누적합을 저장했는데 메모리 초과가 나와서 의문이였습니다. 무엇이 문제였을까요
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
친구인가에서 Union&Find 알고리즘 질문있습니다.
Union 함수에서if (fa != fb) unf[fa] = fb; 해주는 부분이 있는데왜 unf[fb] = fa 를 쓰는 것과의 차이가 있을까요?다른 웹사이트에서 찾아보니깐 fa < fb 일때 unf[fb] = fa하고이외에는 unf[fa] = fb 를 해주는 방식을 채택하고 있길래궁금해서 질문드립니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-F 기저사례 질문
안녕하세요 선생님 강의 잘 보고있습니다수업중 질문이 있는데요, 해당문제는 기저사례가if (k < 0) 과 if (index == 26) 이렇게 두부분이라고 이해했습니다.제가 여기서 가지는 질문은 총 두가지 인데 첫번째 질문은 왜 if (k < 0)일때 0을 반환하는지 이해하지 못하겠습니다.더이상 배울게 없는 경우에는 지금까지 만들어 놓은 mask 매개변수를 이용하여 count 함수를 호출을해서 ret 을 최대값으로 갱신해야하는것이 아닌가요?두번째 질문은 배우지 않고 넘아가는 경우에 ret 을 max 값으로갱신하는데 왜 이때 값을 갱신하는지 이해하지 못하겠습니다. 우선 함수를 int 형을 반환하는것이 아닌 void형으로 반환하는것으로 수정하여 제출하였습니다. 이렇게 하면 이해가 가는데, 혹시 위의 내용들을 조금더 깊게 설명해주실수 있으실까요?http://boj.kr/4925cb61cc264f87998b901fe8800e63
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
답이 3이 되어야 하지 않은가요?
제가 이해를 잘 못하는건지 단순 정렬후4번째 학생을 할인 받고 누적을 구하면 29가 나옵니다.그러면 3번째 학생까지 구매를 해줄수 있는것이니 답이 3이 나와야지 않을까 싶습니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-C 코드 질문있습니다
안녕하십니까 큰돌님강의 영상 보고 해설 코드를 이해한 다음 스스로 살짝 바꿔서 작성해봤는데 거의 유사한데 제대로 실행이 안 되는데 어디가 잘못 됐을까요 ?? 그리고 백준에서는 먼저 메모리 초과라고 뜨네요ㅜhttp://boj.kr/4e41e999182545c7bbe392897d16055d
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
PriorityQueue 클래스를 사용해보고 싶은데 뭐 때문에 오류가 나는지 모르겠어요
테스트 5에서 오류가 나던데 뭐가 문제인지를 못찾겠어요ㅠ import java.util.PriorityQueue;import java.util.Queue;import java.util.Scanner;class Person implements Comparable<Person> {int id;int priority;public Person(int id, int priority) {this.id = id;this.priority = priority;}@Overridepublic int compareTo(Person o) {return o.priority - this.priority;}}public class Main {public static int solution(int n, int m, int[] arr) {int answer = 0;Queue<Person> queue = new PriorityQueue<>();for(int i=0; i<n; i++) {queue.offer(new Person(i, arr[i]));}while(!queue.isEmpty()) {Person tmp = queue.poll();answer++;if(tmp.priority == arr[m] && tmp.id == m) {return answer;}}return answer;}public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[] arr = new int[n];for (int i=0; i<n; i++) {arr[i] = in.nextInt();}System.out.println(solution(n, m, arr));}}
-
미해결Do it! 알고리즘 코딩테스트 with JAVA
[그리디 실전 문제] 최솟값을 만드는 괄호 배치 찾기 (백준 1541) - 반례를 못찾겠습니다 ㅠㅠ
안녕하세요!항상 좋은 강의 감사드립니다!덕분에 하루 하루 실력이 느는것이 느껴질 정도로 도움이 많이 되고있습니다! ㅎㅎ다름아니라 문제 36번 에서 같은 원리로 해결한 코드인데 백준에 재출했을 때 2% 에서 오답처리가 되었고,아무리 찾아봐도 잘못된 부분과 반례를 찾을 수 없어서 질문 남기게 되었습니다 ㅠㅠ아래는 제가 만든 코드입니다.항상 감사드립니다 :)import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String N = sc.next(); String[] split = N.split("-"); int result = 0; for (int i = 0; i < split.length; i++) { String[] A = split[i].split("\\+"); int sum = 0; for (int j = 0; j < A.length; j++) { sum += Integer.parseInt(A[j]); } result -= result == 0 ? sum * -1 : sum; } System.out.println(result); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-E 질문드립니다.
4-E 직접 코딩한 링크입니다.http://boj.kr/1f336e6542f1478a96a0c31745c1196d 저는 비트연산자를 이용하긴 했는데입력 받으면서 1). 각 단어별 쓰인 알파벳 +1 ( 중복 x )2). 각 단어별 비트로 표현으로 전처리를 해준 후sort를 통해 가장 많이 이용한 알파벳 K 개 선정sort 된 알파벳으로 max_word 라는 K개 비트를 사용한 숫자를 만들고(word[i]&max_word)==word[i] 와 같을 경우 ret을 하나씩 올려줬습니다. 예제 및 추가 예제들은 다 맞는데 어디에서 틀린지 감이 안오는 것 같습니다.감사합니다.
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
j가 속한 for문 순회 질문드립니다.
j 순회에서 0부터 i-1까지 앞에서부터 순회하도록 해도 정답이 됩니다. 뒷 강의 들어보니까, 동전 문제처럼 동전이 무한한 경우는 앞에서부터 순회한다고 하셨고 최대 점수문제처럼 문제가 유한한 경우는 뒤에서부터 순회한다고 하셨습니다.(말씀하신 내용은 강의 10-6 섹션, 8:20쯤에서 나옵니다) 혹시 이 문제도 그거랑 연관이 있어서 강의에서처럼 뒤에서부터 순회하신 풀이로 푸신 건가요?
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이 코드도 맞을까요?
이렇게 풀어도 맞을까요?function solution(necc, course) { let answer = "YES"; let lst = []; for (c of course) { for (n of necc) { if (c === n) { lst.push(c); break; } } } let compare = lst.join(""); if (necc !== compare) answer = "NO"; return answer; } console.log(solution("ABC", "ACBC"));
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2 - R
마지막 값 출력 때 '\n'을 빼먹고 안해서 1시간 정도 헤맸습니다... 문제에서 요구한 사항이 아닌 거 같아서 딱히 하진 않았는데 다른 문제를 풀 때에도 명시돼 있지 않더라도 혹시 모르니 하는 것이 나을까요??또한 문제에 명시돼 있진 않으나 이진트리라고 가정하고 풀긴 했는데 이런 것도 혹시 문제의 예시를 보고 추정하면 될까요??
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
알고리즘 교안 P.42 질문
end()가 문자열의 마지막 요소 그 다음을 가리키는 거라고 하셨는데그럼 P.42에서 reverse()할 때도 reverse(a.begin(), a.end())가 아닌 reverse( a.begin(), (a.end()-1) )로 써도 문자열이 완전히 뒤집어 질 수 있지 않나요?
-
해결됨자바 코딩테스트 - it 대기업 유제
잃어버린 강아지 방향 문제
문제에서 북쪽(지도에서 위쪽)으로 이동한다고 했는데북쪽으로 이동이면 이동하게되는 처음 방향은x = 0 , y = -1 이 아닌가요? x = -1 , y = 0 인 이유를 모르겠습니다.
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
코드의 이 부분을 다르게 풀었는데, 괜찮은지 질문드립니다!
private static void bfs() { while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Point now = queue.poll(); for (int j = 0; j < 4; j++) { int nextX = now.x + dx[j]; int nextY = now.y + dy[j]; if (nextX >= 0 && nextY >= 0 && nextX < n && nextY < m) { if (board[nextX][nextY] == 0) { board[nextX][nextY] = 1; day[nextX][nextY] = day[now.x][now.y] + 1; queue.offer(new Point(nextX, nextY)); } } } } } }코드의 bfs 메서드이고, 큐의 사이즈만큼 순회하는 로직int size = queue.size(); for (int i = 0; i < size; i++) { Point now = queue.poll();을 추가했습니다. 결과나 과정 측면에서 봤을 때, 강의에서의 코드와 무슨 차이가 있는지 모르겠는데, 혹시 성능 상에서 기존 코드보다 많이 떨어지는 코드일까요? 이렇게 작성해도 되는지 궁금합니다. 이전 bfs 강의에서는 이렇게 큐의 사이즈를 구해서 순회하는 로직을 사용하더라구요.
-
해결됨자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
해당 문제 다른 풀이에 대한 질문입니다.
import java.io.*; import java.util.*; class Time implements Comparable<Time> { int startTime, endTime; public Time(int startTime, int endTime) { this.startTime = startTime; this.endTime = endTime; } @Override public int compareTo(Time time) { if (this.endTime == time.endTime) { return this.startTime - time.startTime; } else { return this.endTime - time.endTime; } } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); List<Time> times = new ArrayList<>(); StringTokenizer st; int startTime, endTime; for (int i = 0; i < n; i++) { st = new StringTokenizer(br.readLine()); startTime = Integer.parseInt(st.nextToken()); endTime = Integer.parseInt(st.nextToken()); times.add(new Time(startTime, endTime)); } System.out.print(solution(times)); } private static int solution(List<Time> times) { int answer = 0; int endTime = 0; int count = 1; Collections.sort(times); for (Time time : times) { if (time.startTime < endTime) { count++; } else { answer = Math.max(answer, count); count = 1; endTime = time.endTime; } } return answer; } } 이렇게 로직을 구현했는데, 왜 오답 처리되는지 궁금합니다.다른 예외 케이스가 존재할까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
맞왜틀 질문
설명해주신대로 ret=0, d=0~100까지로 해서백준 예제입력을 넣어봤는데출력값이 계속 0이 뜹니다 ㅠㅠ..ret=1로 했을때는 출력값이 정상적으로 5가 뜨긴하는데 왜 ret=0을 넣었을 때 안되는건지 모르겠습니다.뭐가 문제인가요?#include <bits/stdc++.h> using namespace std; int n, h[101][101], visited[101][101], cnt, ret=0; const int dy[4] = {-1, 0, 1, 0}; const int dx[4] = {0, 1, 0, -1}; void dfs(int y, int x, int d){ visited[y][x] = 1; for(int i=0; i<4; i++){ int ny=y+dy[i]; int nx=x+dx[i]; if(ny<0 || ny>=n || nx<0 || nx>=n) continue; if(visited[ny][nx]) continue; if(h[ny][nx] <= d) continue; dfs(ny, nx, d); } return; } int main(){ cin >> n; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ cin >> h[i][j]; } } for(int d=0; d<=100; d++){ cnt=0; fill(&visited[0][0], &visited[101][101], 0); for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ if(h[i][j] <= d) continue; if(visited[i][j]) continue; dfs(i, j, d); cnt++; } } ret = max(ret, cnt); } cout << ret; return 0; }
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
DFS 풀 때 재귀 함수 매개변수로 L값만 넘겨주는 이유가 뭔가요?
DFS를 풀 때 매개변수로 int L 값만 계속 넘겨주잖아요ch[] 배열은 항상 static으로 전역으로 선언해두시고,그리고 재귀 진입 전에 ch[i] = 1 하고 돌고 나서 ch[i] = 0하는데L값도 재귀 진입 전에 L++하고 돌고 나서 L--하면 같은 결과가 나오는데매개변수로 L값만 넣는 이유가 궁금합니다.넣을 꺼면 둘 다 넣거나 둘 다 빼거나 할 것 같은데.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
[3_Q맞왜틀] 어디서 틀렸는지 잘 모르겠어요
http://boj.kr/2c94d34c79944ea3a6c763ef440ac650 예제는 맞는 것 같은데 (visited배열 출력해서 확인함) 제출 하면 틀렸다고 나오네요.. 왜그런지 잘 모르겠어요 ㅜㅜ저는 다음과 같이 코드를 짰습니다.입력받고gohome 함수에서cnt가 k와 같으면 ret++하고 returnny와 nx정의해서 범위 벗어나는지 확인, 방문했는지 확인, 입력받은 배열 값이 T인지 확인, cnt==k인데도 도착지가 집이 아닌지 확인위 조건들을 통과하면 방문하고 재귀함수 호출 , 방문기록 삭제도움 많이 받고있습니다 선생님 감사합니다!