묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
||(or)연산자를 쓰시는 이유가 있나요?
dfs나 bfs문제를 푸실때 if(ny < 0 || ny >= n || nx < 0 || nx >= n) continue; if(a[ny][nx] == 0) continue; if(visited[ny][nx]) continue; 와 같이 or연산을 써서 조건문을 쓰시는데요. and연산자를 쓰지 않고 or연산을 쓰시는 이유가 따로 있으신가요?http://boj.kr/09a17090441545d8ad3b0b7bcac3fb4b 에서 14번 라인과 같이 and연산자로 매번 코드를 짜는데 제가 놓지고 있는게 있나 싶어 여쭈어 봅니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
6 - G 반례 질문
안녕하세요 선생님. 6 - G 제가 짠 코드에 대해서 질문 드립니다. 코드를 짜고나서 굉장히 놀랐는데 선생님과 코드가 거의 비슷하더라고요. 헐 내 실력이 여기까지 올랐나? 했는데 제 코드는 틀렸습니다ㅠㅠㅠ선생님 코드와 다른 점은 lo를 입력된 b+1로 한 것 밖에 없는데 왜 이거는 백준에서 3% 틀렸습니다가 나오는지 잘 이해가 안되서 질문드립니다! #include<bits/stdc++.h>using namespace std;typedef long long ll;ll x, y, ret = -1;int main(){ cin >> x >> y; ll z = (y * 100) / x; ll l = y+1, h = 1e9; ll mid; while(l <= h){ mid = (l+h)/2; if(mid * 100 / (x+mid-y) > z){ ret = mid - y; h = mid - 1; } else l = mid + 1; } cout << ret << "\n";}
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-o 시간초과
http://boj.kr/246379b4039146d9bb6c8660ce6e5dfd입력을 콘솔로바꿨을뿐인데 시간초과가납니다 무슨이유일까요
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
우선순위 큐를 사용하지 않고 그냥 제가 풀었습니다.
#include<iostream>#include <vector>#include<algorithm>#include<unordered_map>using namespace std;int n;int deadline, lamen;int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); unordered_map<int, int> check; cin >> n; vector<pair<int, int>> in(n); for (int i = 0; i < n; i++) { cin >> deadline >> lamen; in[i].first = lamen; in[i].second = deadline; } sort(in.begin(), in.end(),greater<pair<int,int>>()); for (int i = 0; i < n; i++) { int cnum = in[i].second; while (cnum >= 0) { if (check[in[i].second] >= in[i].first) { cnum--; continue; } check[cnum] = in[i].first; } } int result = 0; for (auto& a : check) { result += a.second; } cout<<result; return 0;} 이런식으로 풀어봤는데 어디가 잘못되었는지 잘 모르겠습니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-H: 13144 답(ret) 관련 문의
안녕하세요!5-H 13144 문제 답을 구하는 코드가 이해되지 않아 문의드립니다. ㅠㅠ 예제 : n= 5, 1 2 3 2 1 를 넣어서 값을 구해보았는데 e=3, s=0, ret=3 / e=4, s=1, ret =6 / e=5,s=2, ret=12이렇게 나오긴 하던데 ret 코드를 이해하진 못했어요..그리고 연속한 1개 이상의 수를 뽑는 경우,예제: n =5, 1 2 3 2 1 1개 뽑을 때 1,2,3 -> 3가지2개 뽑을 때 1,2 / 1,3 / 2,3 -> 3가지3개 뽑을 때 1,2,3 -> 1가지총 7가지 .. 아닌가용...ㅠㅠ그럼 시간되실 때 답변 부탁드려요.. long long s, e, cnt[100001], n, a[100001];long long ret;int main(){ scanf("%d", &n); for(int i = 0; i < n; i++){ scanf("%lld", a + i); } while(e < n){ if(!cnt[a[e]]){ cnt[a[e]]++; e++; }else{ ret += (e - s); cnt[a[s]]--; s++; } } ret += (long long)(e - s) * (e - s + 1) / 2; printf("%lld\n", ret); return 0;}
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요! 2 - L NBA 문제 질문이 있습니다.
안녕하세요 선생님 제가 짠 코드에 로직 상 문제가 없다고 생각이들고, 테스트 케이스에 대한 답도 정확히 나오는데 제출 시 틀렸다고 나옵니다. 혹시 제가 놓치고 있는 반례가 있는지 질문드립니다. http://boj.kr/5b06a7f086ee4f499f316de05b95f90a
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
안녕하세요. 4-B 질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 큰돌님 강의 잘듣고 있습니다.해당문제 관련해서 질문이 있는데요.일단 비트마스킹을 이용한 풀이법은 숙지했습니다.근데 비트마스킹을 안쓰고 풀었을때 처음에 틀렸었는데 제가 아래 올린코드에서 Reverse함수의 기저사례 단락에서 "--->이부분!" 이라고 주석표시한 부분 관련해서 궁금한게 있습니다.문제에서 동전의 뒤집기 갯수가 2보다 작을수는 없다고 해서, 전 처음에 이게 문제가 답에대한 제한조건을 걸었다고 생각해서 저렇게 2보다 큰 경우에만 min값을 갱신하도록 코드를 짰었는데요.저 부분을 없애야 정답이더라구요.큰돌님 풀이에서도 2에 대한 제한조건을 거는 부분은 없는것 같은데, 문제에서 해당 예제에관한 설명이 답의 범위에 대해서 제한을 걸어놓은게 아니라 그냥 " 뒷면갯수가 2보다 작은게 불가능하다" 라고 설명해주는 부분인데 제가 잘못이해한건가요??#include <iostream> #include <vector> #include <string> #include <thread> #include <mutex> #include <limits.h> using namespace std; int n; int coin[21][21]; int minVal=INT_MAX; void Change(int i, int j) //요소 하나 바꾸기 { if (coin[i][j] == 1) coin[i][j]= 0; else coin[i][j]= 1; } void ChangeAll(int length, char hw ,int fix) // 한줄 바꾸기('h' : 행 고정 / 'w' : 열 고정) { if (hw == 'h') for (int i = 0; i < length; ++i) Change(fix, i); if (hw == 'w') for (int i = 0; i < length; ++i) Change(i, fix); } void Reverse(int length, char fix, int fixPos) // 행 다 모든 경우의수로 다 뒤집고 열 하나씩 뒤집어보기 { if (fixPos == length) { int ret = 0; for (int i = 0; i < length; ++i) { int sum = 0; for (int j = 0; j < length; ++j){ sum += coin[j][i]; } if ((length - sum) > sum) ret += sum; else ret += (length - sum); } if(ret>=2) //------------------> 이부분! minVal = min(minVal, ret); return; } if (fix == 'h'){ for (int i = 0; i < 2; ++i){ ChangeAll(length, fix, fixPos); Reverse(length, fix, fixPos + 1); } } if (fix == 'w') { for (int i = 0; i < 2; ++i){ ChangeAll(length, fix, fixPos); Reverse(length, fix, fixPos + 1); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; for (int i = 0; i < n; ++i) { string s; cin >> s; for (int j = 0; j < n; ++j) { if (s[j] == 'H') coin[i][j] = 'H' - 'H' + 1; else coin[i][j] = 'T' - 'T'; } } Reverse(n, 'h', 0); cout << minVal << '\n'; }
-
미해결자바 코딩테스트 - it 대기업 유제
미로의 최단거리 탐색(L)질문 드립니다.
아래와 같이 작성했는데, 답이 0이 나옵니다.잘못된 부분이 있을까요?? import java.util.*; import java.io.*; class Main { public static int n,m,L; public static int[][] map ,dist; public static boolean[][] visit; public static int[] dx = {0,0,1,-1}; public static int[] dy = {1,-1,0,0}; public int solution(int[][] board){ int answer = 0; n=board.length; m=board[0].length; map = new int[n][m]; dist = new int[n][m]; visit = new boolean[n][m]; L=0; for(int i=0; i<n;i++) { for(int j=0; j<m; j++) { map[i][j] = board[i][j]; } } bfs(0,0); return answer; } public static int bfs(int r,int c) { Queue<int[]> q =new LinkedList<>(); q.offer(new int[] {r,c}); //0,0대입 visit[r][c] = true; while(!q.isEmpty()) { L++; int len = q.size(); for(int i=0; i<len; i++) { int[] tmp = q.poll(); int nowx = tmp[0]; int nowy = tmp[1]; for(int j=0;j<4;j++) { //상하좌우 탐색 int nx = nowx+dx[j]; int ny = nowy+dy[j]; if(nx>=0 && ny>=0 && nx<n && ny<m) { //맵 범위안이고 if(!visit[nx][ny] && map[nx][ny]==0) { //다음 노드가 방문안햇고, 방문할 수 있다 dist[nx][ny]=L; q.offer(new int[] {nx,ny}); visit[nx][ny] = true; } } } } } return dist[n-1][m-1]; } public static void main(String[] args){ Main T = new Main(); int[][] arr={{0, 0, 0, 0, 0, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 0, 1, 0, 0, 0}, {1, 1, 0, 1, 0, 1, 1}, {1, 1, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 0}, {1, 0, 1, 0, 0, 0, 0}}; System.out.println(T.solution(arr)); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-칠무해 메모리 초과 질문
http://boj.kr/f0d087e04e7b4e30bdf6e3d226471308제한이 256MB 인데 왜 메모리 초과가 되는 건지 궁금합니다!천만 개 다 저장한다고 해도 40MB 아닌가요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
4-2 인접행렬
안녕하세요. 4-2 인접행렬 코드 관련 질문 있습니다. 우선 main 에 이중 for문을 두시고 내부에 go 라는 이름의 재귀함수를 쓰셨는데, 이중포문과 재귀함수의 역할이 동일한 것 같습니다. 아래처럼 go 함수에 재귀 부분을 지우니 똑같이 1,2,3,4 가 잘 출력되는데, 혹시 제가 놓친 부분이 있을까요?void go(int f) { visited[f] = 1; cout << f << '\n'; // for (int i = 0; i < n; i++) { // if (visited[i]) continue; // if (v[f][i]) go(i); // } } int main() { for(int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (v[i][j] && visited[i] == 0) go(i); } } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
수업질문
62187478번 소스 코드 (acmicpc.net) 선생님 제가 짜본 코드인데기존 해설에는 회의시간 끝을 사용해 sort를 하는데저는 강의 듣기 전에 일단 회의시간 시작을 사용해 코딩을 했습니다.시간복잡도는 회의시간 끝을 사용한게 훨씬 좋은거 같긴하네요.근데 제가 짠 코드가 예제들을 돌려도 맞는데어디가 틀린지 모르겠습니다.채점 시 : "틀렸습니다" 로 명시됩니다.감사합니다.
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-F, 11655번 소문자의 경우 출력값 깨짐
// 정답코드 else if(S[i]>='a' && S[i]<='z'){ if (S[i] + 13 > 'z'){ S[i] = S[i]-26+13; } else{ S[i] = S[i] + 13; } } // 입력: Baekjoon Online Judge // 출력: Onrxwbba Bayvar Whqtr // 오류 코드 else if(S[i]>='a' and S[i]<='z'){ S[i] = S[i] + 13; if (S[i] > 'z'){ S[i] = S[i]-26; } } // 입력: Baekjoon Online Judge // 출력: Onrxwbba Bayvar W굌tr문자를 if문에서 비교하기전에 13을 더하면 Judge의 ud부분이 깨지는데 정답코드와 왜 다른건지 궁금합니다.
-
미해결코딩테스트 [ ALL IN ONE ]
시간복잡도
섹션1 [기본]시간복잡도 2:39 부분이에요. 여기서 시간복잡도가 전부 더하면 5n²+3n+33ns 아닌가요 왜 5n²+3n+30ns 인가요ㅠㅠ단순 오타인건지 제가 이해를 못하는건지 모르겠네요...ns는 나노세컨드 이런의미인가요..?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
x와 hi에 대해
안녕하세요이전에도 비슷한 질문이 있었지만 그래도 이해가 잘 가지 않아 질문남깁니다. 문제에서형택이는 앞으로 게임을 다 이긴다하지만 형택이의 게임 기록은 지울 수 없다게임 기록은 이렇다게임 횟수 x : 1~10억이긴 게임 y : 0~X이렇게 되면 게임 횟수 x는 여태까지 진행한 게임 횟수이지 앞으로 할 수 있는 게임의 횟수는 아닌 것 아닌가하는 의문이 생깁니다.강의의 계산식에서도 게임 횟수를 여태까지 진행한 횟수라고 상정하고 초기 z의 계산이 진행되어 있습니다.고민하는 동안 앞으로 몇 판의 게임을 최대값으로 두고 게임을 진행해야하는지 알 수 없기 때문에 이분탐색으로 계산을 진행할 수 없었습니다.수학적인 부분이 약해서 수학적으로 선행된 게임의 횟수가 x라면 추가로 x번 진행하면서 x번 전부 승리했을 때 확률이 바뀌지 않는다면 해당 확률은 변할 수 없다라는 식으로 처리되는 것인지는 잘 모르겠네요 단순히 x가 최대 10억이기 때문에 hi도 10억까지로 잡는다고 하는 부분이 이해가 잘 가지 않아서 질문글을 남깁니다.감사합니다.
-
미해결자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
코드 리뷰 부탁드립니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. function solution(str) { let answer = []; for(let i of str) { if(i != ')') answer.push(i); else { while(answer[answer.length - 1] != '(') { answer.pop(); } answer.pop(); } } return answer.join(''); } let str = "(A(BC)D)EF(G(H)(IJ)K)LM(N)"; console.log(solution(str));해당 코드도 괜찮은 코드인가요?
-
미해결자바 코딩테스트 - it 대기업 유제
공 굴리기 코드 질문드립니다.
클래스 사용해서 작성했는데, 계속 무한 반복을 도는 것 같습니다. 어디가 잘못된건지 잘 모르겠습니다. import java.util.*; class Node implements Comparable<Node>{ int x; int y; int c; Node(int x,int y, int c){ this.x=x; this.y=y; this.c=c; } @Override public int compareTo(Node o) { return this.c - o.c; } } class Main { public static int n,m; public static int INF = (int)1e9; public static boolean[][] visit; public static int[] dx = {0,0,1,-1}; public static int[][] map,dist; public static int[] dy = {1,-1,0,0}; public static int dij(int s1,int s2,int e1, int e2) { PriorityQueue<Node> q =new PriorityQueue<>(); q.offer(new Node(s1,s2,0)); dist[s1][s2] = 0; while(!q.isEmpty()) { Node tmp = q.poll(); int nowx = tmp.x; int nowy = tmp.y; int nowcnt = tmp.c; if(nowcnt>dist[nowx][nowy]) continue; for(int i=0; i<4; i++) { int nx = nowx+dx[i]; int ny = nowy+dy[i]; while(nx>=0 && ny>=0 && nx<n && ny<m && map[nx][ny]==0) { //맵의 범위안을 만족하면 계속 같은 방향으로 이동 nx+=dx[i]; ny+=dy[i]; nowcnt++; } //벽에 막혔다. nx-=dx[i]; //이전 칸으로 이동 ny-=dy[i]; nowcnt--; //이전 칸으로 이동했으니까 갯수 하나 감소 if(dist[nx][ny]>nowcnt) { //우선순위 큐에 넣기 dist[nx][ny] = nowcnt; q.offer(new Node(nx,ny,dist[nx][ny])); } } } //답 출력 if(dist[e1-1][e2-1]==Integer.MAX_VALUE) return -1; return dist[e1-1][e2-1]; } public int solution(int[][] board, int[] s, int[] e){ int answer = 0; n=board.length; m=board[0].length; dist = new int[n][m]; for(int i=0; i<n; i++) Arrays.fill(dist[i], INF); map = new int[n][m]; for(int i=0; i<n; i++) { for(int j=0; j<m;j++) { map[i][j] = board[i][j]; } } answer = dij(s[0],s[1],e[0],e[1]); return answer; } public static void main(String[] args){ Main T = new Main(); System.out.println(T.solution(new int[][]{{0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0}, {1, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 0, 0}}, new int[]{1, 0}, new int[]{4, 5})); System.out.println(T.solution(new int[][]{{0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0}, {1, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 0, 0}}, new int[]{0, 0}, new int[]{4, 2})); System.out.println(T.solution(new int[][]{{1, 0, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {1, 1, 0, 1, 1}, {0, 0, 0, 0, 0}}, new int[]{0, 3}, new int[]{4, 2})); System.out.println(T.solution(new int[][]{{0, 1, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0}, {0, 1, 1, 0, 1, 1}, {0, 0, 0, 0, 0, 0}}, new int[]{0, 0}, new int[]{4, 5})); System.out.println(T.solution(new int[][]{{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0}}, new int[]{0, 0}, new int[]{4, 3})); } }
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
5-S 질문있습니다!
안녕하세요 큰돌 강사님 코드에 대해 질문있습니다공유 코드입니다http://boj.kr/6afa87cbba6042c59e5314d9cd919887문자형 백터에 연산자를 모두 넣고 연산자 인덱스를 백트레킹하여 순열을 구한 뒤 백터에 대입해서 풀었습니다.해설에 있는 코드와 실행시간 차이가 꽤 많이 나는데 두 코드가 어떤 부분에서 효율성의 차이가 나는지 궁금하여 질문 남깁니다.
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-I 시간초과
아래 코드가 시간초과가 나는데 이유를 모르겠습니다. https://www.acmicpc.net/source/62130856ekjongh@gmail.com
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-S 문제를 파이썬으로 풀을 때 질문
위 문제를 파이썬으로 시도했습니다. 몇 주 동안 cpp하다가 파이썬으로 하니 파이썬이 불편함이 있네요..아래 코드를 실행한 경우, 시간 초과가 떴습니다. 제 생각에는 cpp 내용으로 파이썬 문법으로 그대로 옮겨 적은 거나 마찬가지라고 생각하는데요.from sys import stdin def main(): ret = 0 ans = [] n, m = map(int, stdin.readline().split()) visited = [0 for _ in range(n + 1)] tree = [[] for _ in range(n + 1)] def dfs(root: int): visited[root] = 1 cnt = 1 for there in tree[root]: if not visited[there]: cnt += dfs(there) return cnt for _ in range(m): a, b = map(int, stdin.readline().split()) tree[b].append(a) for i in range(1, n): cnt = 0 visited = [0 for _ in range(n + 1)] if len(tree[i]) != 0 and not visited[i]: cnt = dfs(i) if cnt > ret: ans.clear() ret = cnt ans.append(i) elif cnt == ret: ans.append(i) s = "" for i in ans: s += str(i) + " " print(s) if __name__ == "__main__": main() cpp 쓰다가 파이썬을 쓰니 초기화하는 것도 불편하고, 시간도 많이 걸립니다. (오랜만에 파이썬으로 다시 짜보면 무슨 느낌일지 궁금해서 시도해봤습니다. 아직은 병행하지 않고, 강의 완주 후에 파이썬으로 해볼 생각입니다. 파이썬을 사용하려는 이유는 파이썬을 사용하는 백엔드 회사에 들어갈려고 하거든요. 백엔드로 취업할려면 자바 스프링하라는 영상을 이미 시청했습니다.)main 안에다가 변수를 선언하고 그 안에 dfs 함수를 사용해서 클로저 방식으로 사용해봤는데요. 클로저를 사용 안하고 아래 조건문 안에 선언한 후,if __name__ == "__main__": ... visited = [0 for _ in range(n + 1)] main() 아래 코드처럼 dfs()를 호출하기 전에 visited를 초기화했음에도 불구하고도, for i in range(1, n): cnt = 0 visited = [0 for _ in range(n + 1)] if len(tree[i]) != 0 and not visited[i]: cnt = dfs(i) dfs()는 main()을 호출하기 전 visited를 인식하여 문제 풀이에 에러가 발생하는 것 같습니다. 일반적으로 변수를 선언한 후, 초기화하면서 변수에 그 값을 담는 방식이라면 파이썬은 이와 달리 변수 이름이 그 값에 라벨링처럼 지시하는 방식이라서 새롭게 변수를 생성하여 다른 변수로 인식하는 것 같습니다.global 이나 nonlocal 로 선언하여 사용하는 방식이 있으나, 이런 경우 시간 초과가 발생하더군요. 어떻게 해결할 수 있을까요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
질문드립니다.
안녕하세요. 강의 잘 듣고있습니다.아래 코드 체크 한번만 부탁드립니다...답과 차이는 child++ 대신 리스트 사이즈로 체크했는데 어떤 반례가 있는지 모르겠습니다.감사합니다 :)http://boj.kr/9d478a7184dd4667ba1266a2ac37acb0