본문 바로가기

개발/알고리즘

(64)
[SQL] 우유와 요거트가 담긴 장바구니 우유와 요거트를 동시에 담은 카트를 구해야 하는 문제이다. NAME = "요거트" and "밀크"하고 싶지만 이러한 문법은 없다. 해결 방법은 요거트를 가지고 있는 것을 뽑아낸 테이블 B와 밀크를 가지오 있는 것을 뽑아낸 테이블 A를 JOIN하여 두 개의 테이블에서 공통된 CART_ID를 구하면 해결되는 문제이다. SELECT A.CART_ID FROM CART_PRODUCTS A JOIN (SELECT * FROM CART_PRODUCTS WHERE NAME = "요거트") B ON A.CART_ID = B.CART_ID WHERE A.NAME = "우유"
[BOJ] DSLR_9019 이 문제는 L,R 구현을 시간 초과 내서 한 번에 풀지 못하였다. 나는 L,R같은 것을 구현하려고 할 때, 너무 직관적으로만 해결하려고 하는 것 같다. 숫자를 문자열로 바꾼 다음, 그 문자열을 왼쪽으로 반복문 돌리며 한칸 씩 옮기는 방식을 생각했었다. 하지만 테스트를 돌려본 후 바로 시간초과가 나버렸다. 아,, 그리고 지금 코드를 보고 이상해서 새로 안 사실인데, L, R연산 설명을 잘못 이해하고 있었다. 50에서 L하면 05가 아니라 500이구나,,, ,,,,,, 무튼 이 문제는 L,R 연산을 수학 공식처럼 효율성 있게 짜려고 생각해 보는 것이 관건인 것 같다. 문제 구현 자체는 굉장히 쉽다.
[BOJ] 보물섬_2589 위 문제의 풀이 과정은 너무나 쉽다. 근데 너무 어렵게 생각했다,,, 나는 이 문제를 풀 때, 트리의 지름 문제를 떠올렸다. 해당 지점에서 가장 먼 지점을 선택한 후, 그 지점에서 가장 먼 지점을 구한다면 그것이 최대 길이가 되는 줄 알았다. 근데 결국 정답은 그냥 전체 다 돌면서 BFS하면 해결되는 문제였다... 이렇게 쉬운 문제를 왜 어렵게 돌아서 가려고 한 것 일까? 지금은 이 문제에 대해 생각을 더 해보자. 어렵게 생각한 이유가 무엇일까? 전체를 bfs로 도는 방식은 시간초과가 날 것 같은 느낌이 강하게 든다.! 뭔가 이러한 느낌이 강해서,,, 말도 안되는 트리의 지름 방법 떠올리고! 뭐 무슨 visited 다시 계속 초기화하고!! 그랬던 것 같다..ㅠㅠ 이번에 알았으니 깊게 잘 생각해보자. 이 ..
[BOJ] 탈출_3055 이 문제는 풀이 방법이 바로 떠올라서 풀었지만, 효율성이 완전 꽝이였다. 그리고 그 효율성 꽝인 코드 마저 문제를 잘못 읽어 틀렸었다. r,c이 행과 열 같지만, 예제 입력을 보면 그 반대라는 것을 알 수 있다. (약간 말 장난 아닌가 싶긴 했다 ㅠㅠ, 그래도 다음 번엔 문제 꼭 잘 읽자.) 풀이 방법 1. water()로 물을 한 번만 퍼트린다. 2. beaver_move()로 비버를 한 번 움직인다. 비버가 목적지에 도달하면 멈추고, 비버 큐가 비어있어도 멈춘다. 비버 큐가 비어있어서 멈추는 것은 도달하지 못한다고 가정하고 "KAKTUS"를 출력해준다. 후기 이 문제의 핵심은 beaver_move()와 water()에서 큐를 for으로 돌리는 것 같다. 보통 기존의 풀던 bfs()와는 달리, 한 턴에..
[BOJ] 구슬 탈출 2_13460 이 문제는 풀지 못하여 여러 블로그들을 참고하여 답지를 보며 풀었다. 풀이 방법 1. init() - R, B를 찾아 큐에 넣어주는 함수. 2. move - 해당 방향으로 벽에 부딪히거나, O이 나올 때 까지 움직여준다. 그리고 움직인 거리를 cnt로 세어 좌표와 함께 반환해 준다. ( * 여기서 cnt를 같이 구하여 반환하는 이유는 만약 빨간 공과 파란 공이 겹쳐졌을 때, 둘 중 더 많이 움직인 공이 다른 공 위에 있어야 한다. 때문에 cnt를 계산하여 더 큰 값을 가지는 것이 다른 공 위에 있는 상태로 만들기 위해서 이다. - 이 부분이 가장 어려운 부분 중 하나가 아닐까 싶다.) 3. solve() - 1, 2함수를 활용하여 문제를 푸는 함수이다. 궁금증 1. 뭔가 이렇게 하면 너무 많은 경우의 수..
[BOJ] 리모콘_1107 처음 접근 방식 이 문제를 처음 접근했을 때는, 입력받은 수를 문자열로 나눠서 여러 경우의 수를 고려해 주려고 했었다. 하지만 그러한 방식을 생각했을 때, 고려해 줘야 할 상황이 너무 많았고 결국 해결할 수 없었다. 그래서 여러 블로그들을 찾아 보았고, 이 문제는 브루트 포스라는 방법으로 푸는 문제라고 한다. 브루트 포스는 간단하게 말하자면 그냥 전수 조사와 같은 것이다. 모든 경우를 저언부 다 찾아주는 것이다. 풀이 방법 문제를 풀기 위해 생각할 때, 먼저 크게 두 가지를 생각해야 한다. 1. 처음부터 +, -로 계산한 것이 최소일 때. 2. 숫자 버튼으로 이동하여 +,-를 통해 구한 값이 최소일 때. 1번은 너무 간단하다. 처음 시작 값이 100번이라고 했으니 num = abs(100 - n)으로 구..
이진 탐색(Binary Search)란? 알고리즘 문제를 풀다 보면, 배열과 같은 list에서 특정 값을 구하는 문제를 자주 발견할 수 있다. 이러한 여러 데이터들이 있는 list에서 한 데이터를 Search하는 과정은 크게 두가지가 있다. 1. 순차 탐색(linear search): list의 데이터를 순차적으로 찾는 방식. ( 시간 복잡도: O(n) ) 2. 이진 탐색(binary search): list의 데이터를 반씩 나누며 찾는 방식. ( 시간 복잡도: O(log n) ) * 단, 반드시 정렬된 상태에서 탐색해야 한다. 가장 단순해 보이는 순차 탐색을 매번 사용하면 좋겠지만, 알고리즘 문제를 순차 탐색으로 풀다 보면 시간 초과가 나는 경우가 대다수이다. 그렇다면 이진 탐색에 대해 더 알아보도록 하겠다. 이진 탐색이란? 정렬된 데이터가 ..
[BOJ] 트리의 지름_1167 위 문제는 피지컬적인 부분보다 구현 방식을 생각해내지 못했다. 하지만 여러 다른 블로그들을 참고했을 때, 많은 분들이 생각해 내지 못한 것 같다.(아마 익혀야 하는 유형 중 하나인걸까,, 해결 방식은 다음과 같다. 1. 임의의 노드에서 출발하여 가장 긴 길이의 노드를 구한다. 2. 구한 노드 값에서 출발하여 같은 방식으로 가장 긴 길이를 구한다.(이것이 트리의 지름이 된다.) 트리가 있을 떄 가장 긴 부분을 구한 후, 그 노드에서 출발하여 가장 긴 길이를 구하면 그것이 지름이 된다. 이것을 생각해내는 것이 이 문제의 핵심이였다 (근데,, 왜 이게 지름인지는,,, 아직 정확하게 모르겠다. 그냥 뭔가 그럴 것 같긴 한데,, ㅡㅅㅡ) dfs2설명 우선 start, sum을 매개변수로 받았다. sum은 임의의 ..