본문 바로가기

알고리즘['파이썬','JavaScript']/구름19

[해커톤] 구름톤 팀 챌린지 나는 몇 번 등장할까? https://blog.goorm.io/9oormthon_teamchallenge/ 구름톤 팀 챌린지, 알고리즘에 진심인 사람들이 모였어요 9월 23일 진행됐던 구름톤 팀 챌린지에는 4주 동안 하루도 빠짐 없이 알고리즘 문제를 푼 48명이 참가했습니다. 구름LEVEL에서 쌓은 실력을 바탕으로 구름스퀘어에 모여 팀 과제를 수행했는데요. blog.goorm.io https://www.youtube.com/watch?v=jPqopNkljvc 2023. 9. 23.
구름톤 챌린지 4주 day20 학습 일기 마지막 문제는, 새로 삽입하는 문자를 target으로하고, bfs 탐색을 했다. 연결된 target의 개수가 K 이상인 경우 해당 칸들을 '.'으로 대입해야 했는데, bfs 탐색할 때, 조건에 맞는 행과 열을 배열에 추가한 뒤 target개수와 같이 return 해주었다. 주의해야할 부분은, 행과 열을 받을 때 인덱스로 생각해서 전환해주어야 한다는 점. 예를 들어, 1행1열은 사실상 2차원 배열에서(0,0)이기 때문에, inputRow-1, inputCol-1을 해주어야 한다. 오늘의 학습일기 끝! 콘! 우리가 드디어 20일차까지 도달했어ㅠㅠ! 무지! 축하해~!! 2023. 9. 8.
구름톤 챌린지 4주 day19 학습 일기 bfs를 사용해서 풀이를 해도 같은 결과가 나오겠지만 이번 문제는 힙을 사용해서 풀이했다. 다만 예외처리를 해야 하는 부분을 놓치면 안되고, 접근이 불가능한 도시도 고려해야 한다. 방문처리도 해주어야 무한루프를 돌지 않는다. 오늘의 학습 일기 끝 2023. 9. 7.
구름톤 챌린지 4주 day18 학습 일기 dp로 풀지 않았고 시뮬레이션만 활용했는데, 풀이를 꼭 봐야겠다. 자료구조는 딕셔너리를 사용해서 L,R,U,D를 key로, (row, col) 조절 값을 value로 넣어 초기화를 했다. 예를들어, {L:(0,-1)} L의 경우 좌측으로 이동하기 때문에 열을 -1 감소해야 하는 것을 의미한다. 결론적으로는 해당 칸의 중첩점은 가로선 개수와 세로선 개수의 곱으로 표현할 수 있다. 디버깅을 했던 부분은.. 배열을 선언할 때 [[[0,0]]*N for _ in range(N)] 이렇게 한 경우 한 행의 값을 변경할 때마다 통째로 변한다. 얕은 복사로 인해 동일한 주소값을 참조하게 되어 문제가 발생하게 되는 것이 원인이었다.a=[[[0,0]]*(N) for _ in range(N)] print(a) #[[[0,.. 2023. 9. 6.
구름톤 챌린지 4주 day17 학습 일기 런타임 에러 꽤 많은 테스트 케이스에서 런타임 에러가 발생했다. 오류가 발생할 곳이 없다고 생각했는데, 디버깅을 하면서 visit을 체크하는 부분에서 오류가 발생했다. 100000 by 100000 배열은 너무나 컸던 탓일 것이라 생각되어 해당 배열은 메모리를 더 적게 사용하기 위한 방법을 고민했다. 시간복잡도와 공간복잡도.. 런타임 에러가 배열 인덱스 접근할 때가 아니라, 이럴때도 발생한다는 것을 새롭게 배울 수 있었다. 오늘의 학습일기 끝 2023. 9. 5.
구름톤 챌린지 4주 day16 학습 일기 [문제 상황] 탐색할 때 if child in graph[parent]: 이 부분이 시간을 가장 많이 소비했고, 일부 케이스는 시간초과가 발생했다. 되짚어 봤을 때 graph를 2차원 배열로 선언했을 때가 문제의 원인일거라 생각했고 graph = [ [] for _ in range(N+1) ] graph의 내부를 배열 대신, set으로 바꿨다. 예시에서 최악의 경우를 가정했을 때, in 구문에서 시간복잡도가 대폭 증가할 것 같았다. 두가지 정도 간단하게 떠올려 봤을 때 1. graph = [ [] for _ in range(N+1) ] 로 하되, heap 또는 deque를 사용할지 2. set을 사용해서 탐색하는데 시간을 줄이기 였는데, heap을 사용하더라도 pop을 할 때 작은 순으로 정렬되어 있더라.. 2023. 9. 4.
구름톤 챌린지 3주 day15 학습 일기 남은 금액 안에서, 과일 당 조각을 몇 개 구매할 수 있는지를 파악하는 문제 정렬된 배열을 순회할 것이기에, heapq로 최대힙을 활용했다. [1개당 포만감, 가격(=해당 과일의 최대 조각 수)] 으로 heap에 삽입 (1) 첫번째 요소가 개당 포만감인 이유 1개당 가격이 1원으로 동일하다. 따라서 1원(1개)당 포만감이 큰 과일을 먼저 구매하기 위해서였다. (2) 두번째 요소가 가격인 이유 실제로 입력으로 들어온 P값을 넣어주었고, 가격이라고 표현했다. 하지만 한 조각의 가격이 1원이기 때문에, 과일 하나는 P개 만큼의 조각을 갖고있다. 따라서 과일의 최대 조각 개수를 의미한다. 남은 돈 내에서 구매 가능한 최대 조각 수를 구하기 위해 두번째 요소로 사용 (3) 첫번째에 포만감을 넣고 두번째에 가격을 .. 2023. 9. 1.
구름톤 챌린지 3주 day14 학습 일기 방문할 수 있으면서, 번호가 가장 작은 노드를 방문하는 부분에서 두가지 방법으로 풀이를 해보았다. 1. child 노드를 배열로 다 받은 뒤, parent 노드를 순회하면서 child 노드 배열을 sort() 2. child노드 배열을 heapq(최소힙)으로 구성 실행 시간에 미세한 차이가 있기는 했다. 그리고 최소힙에서 pop을 할 때, indent를 너무 들여쓰지 않기 위해 (어제 배운) 코드를 작성했는데 하지만 추가된 코드로 인해 코드가 길어진 측면이 있다. 힙을 사용하지 않고 sort() 후에, 반복문으로 조건에 맞는지 확인하는 방법이 코드를 작성하거나 읽는데는 좋은것 같긴 한데 만약 정렬에 소요되는 시간도 줄여야 한다면 힙을 사용 할 수도 있을 것 같다. 다만 파이썬 heapq를 사용하며 주의해.. 2023. 8. 31.
구름톤 챌린지 3주 day13 학습 일기 발전기 문제에서 발전된 문제 이제는 (1) 건물 유형에 따라 (2) K개 이상의 동일 건물 유형이 있는, 연결된 건물들을 '단지'라고 정한다. M(r,c)데이터를 저장하기 위해 M = [ 0 for _ in range(31) ] 로 지정해서, 1부터 30까지에 해당하는 건물 유형인 M(r,c)를 인덱스로, 단지 수를 배열의 요소로 저장했다. 배열로 만든 이유는, M 배열에서 가장 큰 요소를 찾아야 하는데 요소간 중복이 가능하다 그런데 출력 조건이 같은 값이면 건물 유형인 M(r,c)의 크기가 큰 것을 출력해야 한다. 따라서, 인덱스 역방향으로 탐색을 하는게 편할 것 같았다. => max() 내장함수로 값을 찾은 뒤, 값과 똑같은 요소를 가진 인덱스를 출력 [배운점] 마무리 후에 Q&A 게시판을 봤는데, .. 2023. 8. 30.