안녕하세요~ [초미니 프로젝트] 동전 앞뒤 맞추기 프로젝트를 내 나름대로 바꿔서 팀 정하는 프로그램으로 작성했습니다. 궁금한 것은 아래에 있는 코드를 실행소요 시간입니다. import random import time start = time.time() n = 500000 while(n > 0): random_number = random.randint(1,12) mod = random_number % 3 ## 처음 작성한 방법 # if mod == 0: # print("Red Team!") # elif mod == 1: # print("Blue Team!") # else: # print("Green Team!") ## 더 빠를거라 예상한 방법 team_list = ["Red", "Blue", "Green"] print('{} Team!'.format(team_list[mod])) n -= 1 end = time.time() print(end - start) 랜덤으로 뽑은 숫자로부터 빨강, 파랑, 초록 팀을 출력해주는 코드입니다. 반복문이 여러번 나와서 더 간단하게 만들수 없을까 생각했습니다. 그래서 mod 변수를 인덱스로 사용하여 리스트에 접근하면 더 간단하게 표현할 수 있겠다고 생각했습니다. 그리고 어떤게 더 효율적일지 실험해봤습니다. 처음 작성한 코드는 3.348072052001953, 리스트로 작성한 코드는 4.024623870849609 가 걸렸습니다. 제 생각에는 리스트가 더 효율적일거라 생각했는데 왜 더 시간이 오래 걸렸을까요? 반복문도 mod 값에 맞는 조건을 찾을때까지 순차적으로 접근하고, 리스트도 순차적으로 접근하는 자료구조라 적어도 비슷해야할거라 생각이 듭니다.
강사님! 20 팩토리얼에 2가 몇 번 곱해져있는지 설명해주시는 부분에서 질문이 있습니다. 마지막에 20을 2의 제곱수로 나눴을 때 몫의 정수 부분 합이 2가 몇 번 곱해져 있는지 나타내는 수라고 알려주셨는데요. 이게 어떤 원리인지 궁금합니다. 그러니까 수학적으로 왜 이렇게 같을 수 있는지 알고싶어요!
아래와 같이 완전탐색(?)을 이용해 작성하였는데요, 말씀하신 최적화 방법(약수를 구할때는 해당 수의 제곱근까지만 구해도 약수의 개수와 약수를 구할 수 있다)으로 어떻게 코드를 최적화 할 수 있을지 잘 모르겠습니다. let input = readLine().map { Int($0)! }! var answer: [Int] = [] var previous = input func check(i: Int, divided: Int) -> Bool { if divided % i == .zero { answer.append(i) previous = divided / i return true } else { return false } } if input == 1 { } else { for i in 2...(input) { var flag = true repeat { let check = check(i: i, divided: previous) flag = check } while flag } answer.compactMap { print(String($0)) } }
강의 9분에 등장하는 MakeIndexAge 함수에 관한 질문입니다. MakeIndexAge 함수가 원래 자료구조의 손상을 가하지 않기위해 노드들의 주소들을 담은 배열을 만들고 정렬한 후, 반환하는 함수라는 것은 알고있습니다. 그런데 MakeIndexAge 함수의 반환형이 왜 USERDATA**가 아니라 void**인지 이해가 가질 않습니다. USERDATA**로 반환형을 잡으면 안되나요?
강사님이 작성해주신 코드로 실행을 해봤을때 런타임 에러가 발생합니다. 제가 코드를 잘못 작성한 걸까요? import sys sys.setrecursionlimit(10**6) inpurt = sys.stdin.readline def dfs(y, x): global map_ cur = map_[y][x] map_[y][x] = "" if cur == "-" and map_[y][x + 1] == "-": dfs(y, x + 1) elif cur == "|" and map_[y + 1][x] == "|": dfs(y + 1, x) # 1. initialize N, M = map(int, input().split()) MAX = 50 + 10 # N * M map_ = [["" * MAX] for _ in range(MAX)] # 2. connection info for i in range(1, N + 1): row = input() for j in range(1, M + 1): map_[i][j] = row[j - 1] # 3. dfs answer = 0 for i in range(1, N + 1): for j in range(1, M + 1): if map_[i][j] != "": dfs(i, j) answer += 1 # 4. print print(answer) 코드에 오타가 있는 것 같습니다 map -> map_
LooseQuadTree의 Query함수 호출 시 겹칠 가능성이 있는 모든 LQNode를 수집할 때 일부 결과가 누락된 것으로 판단되어서 문의합니다. 강의 자료의 Query함수의 기능이 틀린 내용인지, 아래 내용이 옳은지 그리고 더 최적화된 로직이 있는지 궁금합니다. public LQNode(LQuadtree tree, LQNode parent, Bounds bounds, int depth) { _tree = tree; _parent = parent; _bounds = bounds; _looseBounds = new Bounds(bounds.center, bounds.size * tree._constantK); _depth = depth; } private List<LQNodeIndex> GetQuads(Bounds bounds) { List<LQNodeIndex> quads = new List<LQNodeIndex>(); if (_children[(int)LQNodeIndex.UPPERLEFT]._looseBounds.Intersects(bounds)) { quads.Add(LQNodeIndex.UPPERLEFT); } if (_children[(int)LQNodeIndex.UPPERRIGHT]._looseBounds.Intersects(bounds)) { quads.Add(LQNodeIndex.UPPERRIGHT); } if (_children[(int)LQNodeIndex.LOWERRIGHT]._looseBounds.Intersects(bounds)) { quads.Add(LQNodeIndex.LOWERRIGHT); } if (_children[(int)LQNodeIndex.LOWERLEFT]._looseBounds.Intersects(bounds)) { quads.Add(LQNodeIndex.LOWERLEFT); } return quads; }
count라는 매개변수를 같이 전달해주기 보다 dfs가 호출될 때마다 answer를 넣어주는 방식으로 풀어봤는데 왜인지 end 값을 찾았을 때 return이 적용이 안되는 거 같습니다. 혹시 어떤 문제가 있는지 봐주실 수 있나요? import java.util.*; import java.io.*; class Main { static int N, start, end, M; static boolean[] visited; static ArrayList<Integer>[] graph; static int answer = -1; private static void dfs(int i) { if (i == end) { System.out.println("end: " + end); return; } visited[i] = true; for (int j = 0; j < graph[i].size(); j++) { int next = graph[i].get(j); if (visited[next] == false) { System.out.println("next: " + next); dfs(next); answer++; } } } public static void main(String[] args) throws IOException{ // 입력 및 초기화 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); N = Integer.parseInt(br.readLine()); // 노드의 개수 StringTokenizer st = new StringTokenizer(br.readLine()); start = Integer.parseInt(st.nextToken()); // 시작 노드 end = Integer.parseInt(st.nextToken()); // 끝 노드 System.out.println(end); M = Integer.parseInt(br.readLine()); // 간선의 개수 visited = new boolean[N+1]; // graph 선언 후 초기화 graph = new ArrayList[N+1]; for (int i = 1; i <= N; i++) { graph[i] = new ArrayList<>(); } for (int i = 1; i <= M; i++) { st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); graph[x].add(y); graph[y].add(x); } System.out.println(Arrays.toString(graph)); // dfs 호출 dfs(start); System.out.println(answer); bw.close(); br.close(); } }
for y in arr_y: for x in arr_x: 제공해주신 코드에서 y,x 각 축을 꼭 다돌아야 하는건가요? 강사님이 설명해주신부분에서 여러명이 한곳에서 모일때 비용을 최소화하기위해서는 여러명중 한명의 집에서 모이면된다. 라는 부분을 참고하면 입력된 4개의 좌표(집)값에 대해 각 좌표 값에대해 나머지 좌표값들의 거리를 계산하면 되는거아닌가요..?? for ex, ey in arr: # [15, 14], [15, 16], [14, 15], [16, 15] for x, y in arr: # [15, 14], [15, 16], [14, 15], [16, 15] 이런식으로요 조언 부탁드립니다.
저번 강의에서 배열과 연결리스트의 장단첨 차이에는 배열은 참조 속도가 상대적으로 빠르지만 데이터 삽입/삭제가 상대적으로 느리고 연결리스트는 그 반대로라고 배웠는데요 자바의 ArrayList와 LinkedList랑 비교해도 똑같은 장단점을 가지나요? 일반 배열과 달리 ArrayList는 처음에 크기를 할당하지 않아도 되니 오버헤드가 좀 감소할 것 같은데, 그래도 데이터 삽입 삭제 시 나머지 데이터의 이동이 필요하기 때문에 여전히 LinkedList 보단 속도가 느릴까요?
// 변경 전 for (let i=0; i < index - 1; i++) { currentNode = currentNode.next; } let deleteNode = currentNode.next; currentNode.next = currentNode.next.next; // 변경 후 for (let i=0; i < index; i++) { currentNode = currentNode.next; } let deleteNode = currentNode; currentNode = currentNode.next; deleteAt()의 나머지 노드에서 삭제 구현 코드에서 '변경 후'와 같은 코드는 제대로 삭제되지 않는 이유가 무엇인가요? 똑같이 동작할거라 생각하고 임의로 변형해봤는데 값에 변화가 없네요. 변경 전의 currentNode.next.next 와 변경 후의 currentNode.next 둘 다 값이 없어 참조하지 않는 건 똑같은데.. currentNode.next 를 참조할 값이 없게 하는거랑 currentNode를 참조할 값이 없게 하는거랑 다르게 처리되는건가요? 아니면 아예 다른 포인트에서 틀린건지.. 궁금합니다
강의 영상마다 질문이 있으면 언제든 그리고 바로 질문 남겨주세요 ! 질문할 때 가장 정확하게 이해할 수 있습니다. 해당 영상과 관련된 질문들을 해주실 때 제가 가장 정확히 답변 드릴 수 있습니다! 취업 전반의 상담이나, "제 코드가 왜 틀렸는지 알려주세요"와 같이 광범위한 질문은, 질문자의 상황에 따라 답변이 달라질 수 있기 때문에, 정확한 답변을 드리기가 어렵습니다 :( 이런 분들을 위해서는 멘토링 항목으로 별도 제공하고 있으니, 다음 링크를 참고해주세요! 이 링크를 통해서는 본인의 코드가 왜 틀렸는지 모를 때 질문을 주셔도 좋고, 취업 전반(면접 준비, 자소서, CS 면접 등) 에 관련한 질문을 주시면 답변 드리겠습니다 :) "이 질문은 해도 되나?"라는 생각이 드신다면 우선 남겨주세요! 제가 답변 드리기 어려운 건 멘토링에 올려 달라고 재요청 드리겠습니다 :) 1. 저번 강의에서 풀이하신 것처럼 이번 강의에도 재귀 함수의 depth를 그려보았는데 맞나요? 2. 혹시 CS 면접 관련해서 대략 어떻게 준비해야 하는지 질문 드려도 되나요?