소개
- 알고리즘 블로그 운영중
- 프로그래밍 대회 다수 수상
- ICPC Seoul Regional 3회 진출 (2021, 2022, 2023)
- 2024 ICPC Asia Pacific Championship 진출
강의
전체 1수강평
- 세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
- 세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
- 세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
- 세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
- 세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
게시글
질문&답변
2024.11.17
7576번 풀이 코드 관련 질문
안녕하세요, purplejay님! 코드를 살펴본 결과, 올바른 풀이로 코드를 작성하신 거 같습니다.단, max 함수에 대해 오해를 하시고 사용하신 것 같습니다. max 함수의 공식 문서를 살펴보면, 원소 중에서 가장 큰 원소를 반환한다고 나와 있습니다.따라서, 2차원 리스트를 max 함수에 넣는다면 가장 큰 값들로 이루어진 1차원 리스트가 나오는 것이 아닌, 1차원 리스트 중에서 가장 큰 리스트가 반환이 됩니다. 예를 들자면, max([[0, 1, 2], [1, 0, 1]])의 결과는 [2, 1]이 아닌, [1, 0, 1] 이라는 것입니다.즉, [0, 1, 2]과 [1, 0, 1] 중에서 [1, 0, 1]이 더 크므로 [1, 0, 1]을 반환한 것이죠.리스트의 크기 비교는 인덱스가 낮은 원소가 더 높으면 크기가 크다고 생각하시면 됩니다.즉, [1, 1, 1, 2, 1]이 [1, 1, 1, 1, 10]보다 큰 것이죠.두 리스트의 크기 비교에 관한 자세한 설명은 여기를 참고해세요 :) 질문자님이 의도하신 대로 max 함수를 이용하려면 max(max(md) for md in min_dist) 와 같이 사용하시면 될 것 같습니다. 이를 고쳐 코드를 작성하면 아래와 같이 작성할 수 있겠네요.import sys from collections import deque def bfs(cands): global data, N, M, min_dist, dx, dy visit = [[False] * M for _ in range(N)] q = deque() for (i, j) in cands: q.append([i, j, 0]) visit[i][j] = True while q: x, y, dep = q.popleft() min_dist[x][y] = min(min_dist[x][y], dep) for di, dj in zip(dx,dy): ni = x + di nj = y + dj if (0 질문에 대해 만족스러운 답변이 되었기를 바랍니다!추가로 궁금하신 점이나 더 자세한 설명이 필요하시다면 언제든지 말씀해 주세요. 😄5점 수강평을 남겨주시면 향후 더 나은 강의를 만드는 데 큰 도움이 됩니다. 🌟
- 0
- 1
- 29
질문&답변
2024.11.12
2133번 문제풀이 관련 질문
안녕하세요, 최재원님! [BOJ 2133 풀이1 최적화에 대한 질문]말씀하신 것처럼 누적합을 활용하면 풀이 1의 시간 복잡도를 O(N)으로 줄일 수 있습니다.누적합을 활용하여 풀이1을 작성해보면 아래와 같이 나타낼 수 있겠네요.# solve dp = [0] * 31 dp[0] = 1 psum = [0] * 31 psum[0] = 1 for n in range(2, 31, 2): dp[n] = dp[n - 2] * 3 if n - 4 >= 0: dp[n] += 2 * psum[n - 4] psum[n] = psum[n - 2] + dp[n] # input N = int(input()) print(dp[N]) [효율적인 코딩테스트 단기 공부법에 대한 질문]코딩테스트에 나오는 빈도수로 따지면, 필수 알고리즘1 > 그래프 알고리즘 > 필수 알고리즘2 로 나타낼 수 있겠네요. 따라서 필수 알고리즘1을 다 들으셨다면, 그래프 알고리즘을 먼저 들으시는 것을 추천드립니다! 또 궁금하신 점 있으시면 질문해주세요. :)
- 1
- 1
- 31
질문&답변
2024.11.10
1987번 관련 질문입니다.
안녕하세요, 최재원님! 백준에 제출할 때 Python3 가 아닌 PyPy3 로 제출하시면 통과할 것입니다.그러한 이유는 백준에 파이썬 코드를 제출할 때 주의할 점 강의를 참고해 주시면 감사하겠습니다. 또 궁금하신 점 있으시면 질문해주세요. :)
- 0
- 2
- 31
질문&답변
2024.11.10
3085번 사탕 게임에서 제 풀이가 왜 틀린걸로 처리되는지 잘 모르겠습니다.
안녕하세요, 최재원님! count_max(ser) 에서 가장 긴 부분의 길이를 반환해야 하므로 아래와 같이 고쳐 주시면 될 것 같습니다!def count_max(ser): best = 0 count = 0 bef = '.' for idx in range(len(ser)): if bef != ser[idx]: count = 1 else: count += 1 best = max(best, count) bef = ser[idx] return best 또 궁금하신 점 있으시면 질문해주세요. :)
- 0
- 2
- 28
질문&답변
2024.10.26
백준 문제풀이 팁
안녕하세요, Taejin Kim님! 결론부터 말씀드리자면, 백준에서 틀린 문제에 대해 어떤 테스트케이스가 틀렸는지 알 수 있는 방법은 존재하지 않습니다. 그러한 이유는 문제의 테스트케이스 또한 문제를 만든 저작자의 저작물이기 때문에 공개를 하지 않는 것이라고 생각하면 될 것 같습니다. 물론, 틀린 테스트케이스를 알 수 없으니 공부하기 힘들다고 느낄 수 있을 거라고 생각합니다.저 또한 처음 문제를 풀 때는 틀린 테스트케이스를 알 수 없으니 내 풀이 자체가 틀렸는지 또는 풀이는 맞지만 미처 고려하지 못한 경우가 있는지 등 채점이 틀린 정확한 이유를 파악하기 어려웠습니다. 하지만, 이러한 상황 속에서 틀린 이유를 찾는 연습을 해야 한다는 말씀을 드리고 싶습니다.왜냐하면, 코딩테스트나 대회 문제를 풀 때의 환경 또한 어떤 테스트케이스를 틀렸는지를 알려주지는 않기 때문입니다. 실제로, 코딩테스트에서 내 풀이가 틀렸는데 그러한 부분을 찾는 연습이 잘 되어 있지 않다면 한 문제에 1-2시간 동안 묶여 좋은 성적을 얻지 못할 수도 있습니다. (실제로 빈번히 일어나는 현상입니다.) 그래서, 자신의 코드의 틀린 부분을 찾는 팁들을 조금이나마 드리겠습니다.틀린 이유는 크게 2가지로 분류될 수 있습니다 첫 번째는 풀이의 로직 자체가 틀린 경우이고, 두 번째는 구현 과정에서 고려하지 못한 경우나 잘못 구현한 경우에 해당합니다. 제출을 했는데 틀렸다면, 풀이의 로직 자체가 틀린 경우일 수도 있으니 다시 한번 풀이가 맞는지 확인하는 과정이 필요합니다. 확인했는데 풀이의 로직은 맞는 것 같다면 구현 과정에서 실수를 한 것일 확률이 높습니다.사실, 풀이의 로직이 맞는지 틀린지 여부는 제출하기 전이 아닌, 코드를 구현하기 전에 최대한 검증을 해야 합니다. 풀이의 로직이 맞다면, 구현 과정에서 고려하지 못한 경우나 잘못 구현한 경우에 해당하는데요.따라서, 내가 설계한 풀이(아이디어)를 코드로 잘 구현했는지 살펴보고 틀린 부분이 없는지 확인합니다. 특히, 엣지 케이스를 확인하는 것이 좋은데요. 엣지 케이스라는 것은 끝에 해당하는 케이스를 의미합니다. 예를 들어, 문제에서 주어지는 범위가 0부터 10000까지라고 한다면, 0인 경우에 내 코드가 잘 돌아가는지, 10000인 경우에 내 코드가 잘 돌아가는지 등을 파악하는 것이죠. 또한 내 코드에 여러 가지 경우를 처리하는 로직이 포함되어 있다면 (여러 개의 if 문을 의미), 각 경우를 잘 처리하는지 실제로 코드로도 잘 돌아가는지 확인해 보는 것입니다.그리고, 가끔은 ==을 써야 하는데, =을 쓴다거나 하는 실수를 하니 코드를 전체적으로 훑어보며 문법적으로 어색한 부분이 있는지 찾아보는 것 또한 좋습니다. [정리]제 나름대로 팁들을 적어보았는데요. 이러한 팁들을 가지고 틀린 문제에 대해 어떤 부분 때문에 틀렸는지를 연습해 보는 것을 추천합니다. 결론적으로 가장 중요한 것은 자신이 틀린 부분은 자신이 잘 찾아야 하기 때문입니다. 그렇기에, 자신이 자주 실수하는 부분은 정리를 한다던가 하는 과정을 거치면 좀 더 틀린 부분을 찾는 시간이 단축될 거라고 생각합니다. 어쨌든 핵심은!! 코드의 로직을 훑어보며, (문제의 예시에 나온 것이 아닌) 여러 입력값들을 직접 넣어보며 틀린 부분을 찾는 연습을 하는 것만이 틀린 부분을 찾는 실력을 높여줄 것입니다.당연히 처음에는 시간이 오래 걸리고 힘들겠지만, 틀린 부분을 잘 찾는 것 또한 매우 중요한 능력이고 실력이기 때문에, 틀린 부분을 찾는 과정 또한 문제를 푸는 과정이라고 생각해 주시면 좋을 것 같습니다. 또 궁금하신 점 있으면 질문해 주세요. :)
- 0
- 1
- 55