// 조건문 // if else // when fun main() { val testlist = mutableMapOf<String, Int>() testlist["a"] = 10 testlist["b"] = 50 testlist["c"] = 60 testlist["d"] = 100 testlist["e"] = 70 testlist["f"] = 30 // 50점이상 구하기 println(testlist.keys:: class.java .simpleName) for (i in testlist){ println(i.key:: class.java .simpleName) } } 위 코드처럼 작성 후 타입을 비교하였을 때 두가지의 타입이 다르게 나와있는데 그 이유를 모르겠습니다
int main() { fill(&a[0], &a[10], 100); for(int i = 0; i < 10; i++){ cout << a[i] << " "; } cout << '\n'; fill(&b[0][0], &b[9][10], 2); for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++){ cout << b[i][j] << " "; } cout << '\n'; } return 0; 이 코드에서 fill(&a[0], &a[10], 100); 이 부분과 교안에 설명된 부분을 보면 알 수 있듯이 마지막에 쓰이는 인덱스는 포함되지 않아 실제로 a[9]까지 초기화가 가능한 것으로 이해를 하였습니다 그런데 왜 밑에 2차배열을 초기화하는 fill(&b[0][0], &b[9][10], 2);에서는 b[10][10]이 아닌 b[9][10]인지 궁금합니다. 또 b[9][9]로 수정하여 실행해본 결과가 b[9][10]으로 수행한 결과와 같은 이유도 궁금합니다! 긴 질문 죄송합니다!
안녕하세요 ! 채점 프로그램 관련 문의가 있어서 글을 작성하게 되었습니다. 전에 풀었던 문제들을 다시 풀어보는 과정에서 전에 100점이 나왔던 문제들을 다시 한번 채점 프로그램을 돌리니 wrong_answer이라고 나와서(기존의 AA파일을 돌림) 답안 소스로 테스트를 해보았는데 똑같이 wrong_answer 라고 계속 나오는 문제가 발생해서 글을 작성하게 되었습니다. 감사합니다.
안녕하세요 큰돌님 1학년 문제를 풀었는데, dp배열 초기화의 유무에 따라 답이 갈립니다. 저는 0이라는 값도 결과값이 될 수 있는 값 중 하나라고 생각하여 dp배열을 -1로 초기화했습니다. 그런데 이런 경우 답이 틀렸다고 나옵니다. 오히려, fill을 이용한 별도의 초기화 없이 기본적은 0으로 상태를 두면 맞다고 나옵니다. 제가 어떤 점을 잘못 생각한건가요? 감사합니다. 소스코드 : http://boj.kr/aaa7dca582ec4827803e5b5826b6cdb5
구현하고 예제 및 반례를 넣어보고 디버깅도 나름 해봤는데 도저히 틀린 점을 못 찾겠습니다. 강의와 접근 방식이 조금 다르지만 비슷한 것 같은데 어떤 점에서 틀린 건지 알려주시면 감사할 것 같습니다 ㅠㅠ #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한 후 최솟값을 찾을 수 있도록 작성했습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. https://www.acmicpc.net/source/share/f81085fda0c842898c7f440cecb12d4e 안녕하세요. 선생님 제가 선생님 풀이를 보기전에는 이렇게 2차원 배열을 통해서 구간별 누적합을 저장했는데 메모리 초과가 나와서 의문이였습니다. 무엇이 문제였을까요
Union 함수에서 if (fa != fb) unf[fa] = fb; 해주는 부분이 있는데 왜 unf[fb] = fa 를 쓰는 것과의 차이가 있을까요? 다른 웹사이트에서 찾아보니깐 fa < fb 일때 unf[fb] = fa하고 이외에는 unf[fa] = fb 를 해주는 방식을 채택하고 있길래 궁금해서 질문드립니다.
안녕하세요 선생님 강의 잘 보고있습니다 수업중 질문이 있는데요, 해당문제는 기저사례가 if (k < 0) 과 if (index == 26) 이렇게 두부분이라고 이해했습니다. 제가 여기서 가지는 질문은 총 두가지 인데 첫번째 질문은 왜 if (k < 0)일때 0을 반환하는지 이해하지 못하겠습니다. 더이상 배울게 없는 경우에는 지금까지 만들어 놓은 mask 매개변수를 이용하여 count 함수를 호출을해서 ret 을 최대값으로 갱신해야하는것이 아닌가요? 두번째 질문은 배우지 않고 넘아가는 경우에 ret 을 max 값으로갱신하는데 왜 이때 값을 갱신하는지 이해하지 못하겠습니다. 우선 함수를 int 형을 반환하는것이 아닌 void형으로 반환하는것으로 수정하여 제출하였습니다. 이렇게 하면 이해가 가는데, 혹시 위의 내용들을 조금더 깊게 설명해주실수 있으실까요? http://boj.kr/4925cb61cc264f87998b901fe8800e63
안녕하십니까 큰돌님 강의 영상 보고 해설 코드를 이해한 다음 스스로 살짝 바꿔서 작성해봤는데 거의 유사한데 제대로 실행이 안 되는데 어디가 잘못 됐을까요 ?? 그리고 백준에서는 먼저 메모리 초과라고 뜨네요ㅜ http://boj.kr/4e41e999182545c7bbe392897d16055d
테스트 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; } @Override public 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)); } }
안녕하세요! 항상 좋은 강의 감사드립니다! 덕분에 하루 하루 실력이 느는것이 느껴질 정도로 도움이 많이 되고있습니다! ㅎㅎ 다름아니라 문제 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); } }
4-E 직접 코딩한 링크입니다. http://boj.kr/1f336e6542f1478a96a0c31745c1196d 저는 비트연산자를 이용하긴 했는데 입력 받으면서 1). 각 단어별 쓰인 알파벳 +1 ( 중복 x ) 2). 각 단어별 비트로 표현 으로 전처리를 해준 후 sort를 통해 가장 많이 이용한 알파벳 K 개 선정 sort 된 알파벳으로 max_word 라는 K개 비트를 사용한 숫자를 만들고 (word[i]&max_word)==word[i] 와 같을 경우 ret을 하나씩 올려줬습니다. 예제 및 추가 예제들은 다 맞는데 어디에서 틀린지 감이 안오는 것 같습니다. 감사합니다.
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"));
마지막 값 출력 때 '\n'을 빼먹고 안해서 1시간 정도 헤맸습니다... 문제에서 요구한 사항이 아닌 거 같아서 딱히 하진 않았는데 다른 문제를 풀 때에도 명시돼 있지 않더라도 혹시 모르니 하는 것이 나을까요?? 또한 문제에 명시돼 있진 않으나 이진트리라고 가정하고 풀긴 했는데 이런 것도 혹시 문제의 예시를 보고 추정하면 될까요??
end()가 문자열의 마지막 요소 그 다음을 가리키는 거라고 하셨는데 그럼 P.42에서 reverse()할 때도 reverse(a.begin(), a.end())가 아닌 reverse( a.begin(), (a.end()-1) )로 써도 문자열이 완전히 뒤집어 질 수 있지 않나요?
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 강의에서는 이렇게 큐의 사이즈를 구해서 순회하는 로직을 사용하더라구요.