본문 바로가기
반응형

전체 글24

[이코테 - 구현] 왕실의 나이트 왕실의 나이트는 이전에 풀었던 상하좌우 문제와 상당히 유사하다. 어떤 문제인지 바로 설명에 들어가도록 하겠다. 이게 무슨 말인지는 아래의 설명을 보면 이해가 갈 것이다. 문제 설명 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다. 1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기 2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기 이 때, 현재 나이트의 위치가 주어졌을 때, 나이트가 이동할 수 있는 경우의 수를 구하면 된다. 문제 해결 아이디어 문제를 봤으면 상하좌우 문제와 상당히 유사하다는 것을 알 수 있다. 이해가 가지 않는다면 문제 해결 아이디어를 잘 보면 된다. 먼저, 입력받는 값으로부터 행과 열의 좌표를 구한다. 우선 문제에서 입력 조건이 첫째 줄에 8 x 8.. 2022. 10. 8.
[알고리즘 공부] 삽입정렬 오늘의 알고리즘은 삽입정렬입니다. 삽입정렬은 처리되지 않은 데이터를 골라 적절한 위치에 삽입합니다. 사실 오늘 포스팅하는 삽입 정렬 알고리즘을 포함해서 대다수의 정렬 알고리즘들은 아마 실무에서는 사용하는 일이 없을 거라고 생각됩니다. 그만큼 언어 내장 정렬 알고리즘이 강력하다는 의미겠죠. 하지만 정렬 알고리즘에 어떤 알고리즘이 있고, 어떻게 동작하는지 알아두는 것은 중요하다고 생각합니다. 삽입정렬 시간복잡도 삽입정렬의 시간복잡도는 2중 for문을 사용하기 때문에O(n^2)입니다. 하지만 현재 리스트의 데이터들이 거의 정렬되어 있는 상태이면 매우 빠르게 동작하며, 최선의 경우 O(n)의 시간복잡도를 가지고 있습니다. 선택정렬 코드 array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for.. 2022. 10. 7.
[알고리즘 공부] 선택정렬 오늘의 알고리즘은 선택정렬입니다.선택정렬은 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복하여 정렬하는 정렬 알고리즘으로 버블정렬과 함께 가장 기초적인 알고리즘에 속합니다. 선택정렬 시간복잡도 선택정렬은 2중 반복문을 이용하기 때문에 O(n^2)의 시간복잡도를 가지고 있습니다. 즉, 버블정렬처럼 엄청나게 느린 정렬 알고리즘이라는 이야기입니다. 내장 정렬보다 훨씬 느리고, 그렇기 때문에 실무에서는 거의 쓰일 일이 없습니다. 선택정렬 코드 array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8] for i in range(1, len(array)): min_idx = i #가장 작은 원소의 인덱스 for j in range(i + 1, len(array)): if array[.. 2022. 10. 6.
[이코테 - 구현] 시각 시각 문제도 구현파트에 포함되는 문제이다. 지금까지 문제를 풀어보니까 구현문제는 사실 그리디 알고리즘이랑 큰 차이는 없는 것 같다는 생각이 든다. 어쨌든 이번 문제도 한 번 풀어보겠다. 문제 설명 0이상 23 이하의 정수 n이 주어지면, 00시 00분 00초부터 23시 59분 59초까지 숫자 3이 포함되어 있는 모든 시각의 경우의 수를 구하는 것이다. 예를 들면, 00시 03분 00초나 00시 00분 03초나 이런것들을 모두 구하는 것이다. 입력조건은 첫째줄에 0이상 23이하의 정수가 주어지고, 출력조건은 3이 포함된 모든 시각의 개수를 구하면 된다. 문제 해결 아이디어 처음에는 어떻게 풀어야하나 고민해봤는데, 생각해보니까 최대가 24*60*60 이면 10만개도 안나온다는 생각이 들었다. 이정도면 그냥 .. 2022. 10. 5.
[이코테-구현] 상하좌우 상하좌우 문제는 이코테 책에 수록된 구현문제이다. 그리디 알고리즘은 이전 포스팅에서 끝나고 이제는 구현 문제로 넘어온 것이다. 문제 설명 여행가 A는 N x N ㅋ크기의 정사각형 공간에 서있다. 이 때, 시작 좌표는 항상 1, 1이고, L, R, U, D 중 하나의 문자가 반복적으로 주어진다. LRUD는 각각 왼쪽으로 한 칸, 오른쪽으로 한 칸, 위쪽으로 한 칸, 아래쪽으로 한 칸 움직인다는 의미이다. 정사각형 공간을 벗어나는 움직임은 무시된다. 입출력 조건은 각각 n의 크기와 이동할 계획서가 주어지면 도착할 지점의 좌표를 공백으로 구분하여 출력하는 것이다. 문제 해결 아이디어 나는 이번 문제를 다음과 같이 풀었다. 입력받은 배열만큼 반복해서, 계획이 정사각형을 벗어나는지 확인한다. 만약 벗어나지 않으면.. 2022. 10. 4.
[이코테 - 그리디 알고리즘] 숫자 카드 게임 숫자 카드 게임 문제는 2019 국가 교육기관 코딩 테스트 기출문제라고 한다. 사실 그게 중요한 건 아니니까 넘기고, 문제를 설명하도록 하겠다. 문제 설명 숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다. 이 게임에서는 숫자가 쓰인 카드들이 N x M 형태로 놓여있다. 여기서 N은 행이고, M은 열이다. 우선 먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택하고, 선택된 행에서 가장 숫자가 낮은 카드를 뽑아야 한다. 따라서 처음에 처음에 카드를 골라낼 행을 선택할 때, 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다. 입력조건 첫 째 줄은 N과 M의 입력조건(1 2022. 10. 3.
[이코테 - 그리디 알고리즘] 큰 수의 법칙 이것이 취업을 위한 코딩테스트다 with 파이썬이라는 책이 있다. 유튜버 나동빈님이 쓰신 책이다. 이 책에는 큰 수의 법칙이라는 문제가 나오는데, 이 문제는 그리디 알고리즘으로 푸는 문제이다. 문제 설명 N개의 자연수로 이루어진 배열이 입력되었을 때, 배열의 수들을 이용하여 M번 더하여 가장 큰 수를 만들어야 한다. 단, 배열의 특정한 인덱스에 해당하는 수가 K번을 초과하여 연속으로 더해질 수 없고, 인덱스가 다른 경우 수가 같더라도 서로 다른 수로 간주한다. 문제 해결 아이디어 "K번을 초과하여 연속으로 더해질 수 없다"는 문구와 "인덱스가 다른 경우 수가 같더라도 서로 다른 수로 간주한다"는 문구에 주목을 해서 알고리즘을 설계했다. K번을 초과하여 더해질 수 없다는 말은 배열에서 가장 큰 수가 K번까.. 2022. 10. 2.
[알고리즘 공부] 버블 정렬(Bubble Sort) 정렬(整列)은 항목들을 체계적으로 정리하는 과정으로, 순서를 정하는 것이라는 사전적 의미가 있다. 즉, 순서를 정하는 알고리즘이 정렬 알고리즘이라고 할 수 있다. 그 중에서 오늘은 버블 정렬(Bubble Sort)에 대해서 공부하고자 한다. 버블 정렬 성능 버블정렬에서 버블은 원소들이 거품이 올라오는 것처럼 보이기 때문에 붙은 이름이라고 한다. 버블정렬은 구현하기는 쉽지만 최악의 정렬 알고리즘이다. 거의 모든 상황에서 O(n^2)의 시간복잡도를 보여주기 때문이다. 즉, 정렬할 자료의 수의 제곱에 비례해서 계산시간이 늘어나고, 이 말은 1만개를 1초에 정렬하면 10만개를 정렬하는 데에는 100초 정도가 필요하다는 이야기이다. 버블정렬은 1번째와 2번째 원소를 비교해서 정렬하고, 2번째와 3번째, n-1번째.. 2022. 10. 1.
반응형