Algorithm
[이코테] 6. 정렬 알고리즘 - 선택, 삽입, 퀵, 계수정렬
정렬 알고리즘 정렬(Sorting)이란 데이터를 특정한 기준에 따라 순서대로 나열하는 것을 말함. 일반적으로 문제 상황에 따라서 적절한 정렬 알고리즘이 공식처럼 사용됨. 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬 등이 있음. 선택 정렬 핵심 동작 원리 처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복함. 선택 정렬의 시간 복잡도 선택 정렬은 N번 만큼 가장 작은 수를 찾아서 맨 앞으로 보내야 함. 구현 방식에 따라서 사소한 오차는 있을 수 있지만, 전체 연산 횟수는 다음과 같음 N + (N -1) + (N-2) + ... + 2 이는 (N^2 + N - 2) / 2 로 표현할 수 있는데, 빅오 표기법에 따라서 O(N^2)이라고 작성. 예시 더보기 이런 방..
[이코테] 5. DFS & BFS
DFS/BFS DFS/BFS = 대표적인 그래프 탐색 알고리즘. 코딩테스트에 꼭 나오는 유형. 탐색 = 많은 양의 데이터 속에서 원하는 데이터를 찾는 과정 DFS/BFS를 알기위한 사전 개념으로 스택과 큐에 대해서 알아야함. 스택과 큐 자료구조 스택과 큐를 설명하라고 한다면, 이것 부터 떠올려라! 스택 : 막힌 통(프링글스 통) / 선입후출 큐 : 뚫린 통(터널) / 선입선출 Python에서 스택 자료구조를 이용하려면, list 를 사용하면 된다. stack = [] # 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제() stack.append(5) stack.append(2) stack.append(3) stack.append(7) stack.po..
[이코테] 4. 구현 - 문자열 재정렬
문자열 재정렬 : 문제 설명 알고리즘 문제를 접할 때, 수와 숫자의 차이를 이해해야한다. 수는, 세 자리수, 네 자리수(100, 1000) 등 정수와 같은 데이터를 의미함. 숫자는 1, 0, 0 / 1, 0, 0, 0 등 하나하나의 개수를 의미한다고 생각하면 구분하기 쉬움 문제 해결 아이디어 정답 data = input() result = [] value = 0 # 문자를 하나씩 확인하며 for x in data: # 알파벳인 경우 결과 리스트에 삽입 if x.isalpha(): result.append(x) # 숫자는 따로 더하기 else: value += int(x) # 알파벳을 오름차순으로 정렬 result.sort() # 숫자가 하나라도 존재하는 경우 가장 뒤에 삽입 if value != 0: r..
[이코테] 4. 구현 - 왕실의 나이트
왕실의 나이트 : 문제 설명 이 문제는 시뮬레이션, 완전탐색, 구현 문제라고 할 수 있다. 문제 해결 아이디어 요구사항대로 충실히 구현하면 됨. 나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인해야함. 리스트를 이용하여 8가지 방향에 대한 방향 벡터를 정의! 정답 # 현재 나이트의 위치 입력받기 input_data = input() row = int(input_data[1]) column = int(ord(input_data[0])) - int(ord('a')) + 1 # 나이트가 이동할 수 있는 8가지 방향 정의 steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)] # 8가지 방향에 대하여 ..
[이코테] 4. 구현 - 시각(완전탐색 유형)
시각: 문제 설명 문제 해결 아이디어 우리는 완전탐색, 시뮬레이션 등의 유형 또한 구현 유형이라고 칭하기로했다. 정답 h - int(input()) count = 0 for i in range(h + 1): for j in range(60): for k in range(60): if '3' in str(i) + str(j) + str(k): count += 1 print(count) '''output 5 11475 ''' 이코테 2021 시리즈 씹어먹기 by 조랭이떡 시리즈 목차 더보기 코딩테스트 출제 경향 및 알고리즘 성능 평가 파이썬 문법 부수기 수, 리스트 자료형 문자열, 튜플, 사전, 집합 자료형 기본 입출력 조건문 반복문 함수와 람다 표현식 자주 사용되는 표준 라이브러리 그리디 그리디 알고리즘이..
[이코테] 4. 구현(Implementation) 유형 설명 및 예제 문제(상하좌우)
구현(Implementation)이란? 흔히 알고리즘에서의 구현 유형의 문제란 무엇을 의미할까요? 풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제를 지칭 구현 유형의 예시 알고리즘은 간단한데 코드가 지나칠 만큼 길어지는 문제 이 부분은 프로그래밍 언어를 어떤 것을 사용하느냐에 따라 달라짐. 실수 연산을 다루고, 특정 소수점 자리까지 출력해야하는 문제 문자열을 특정한 기준에 따라서 끊어 처리해야 하는 문제 적절한 라이브러리를 찾아서 사용해야 하는 문제 모든 순열과 조합을 찾는 문제를 파이썬에서는 itertools 라이브러리를 이용해서 매우 간결히 작성 가능. 일반적으로 알고리즘 문제에서 2차원 공간은 행렬(Matrix)의 의미로 사용됨. 여기서 유의할 점은 행과 열의 축방향, (0, 0)의 위치..
[이코테] 3. 그리디 알고리즘 - 모험가 길드
그리디 알고리즘 - 모험가 길드 문제 설명 한 마을에 모험가가 N명 있습니다. 모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데, '공포도'가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어집니다. 모험가 길드장인 조랭이는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다. 조랭이는 최대 몇 개의 모험가 그룹을 만들 수 있는지 궁금합니다.N명의 모험가에 대한 정보가 주어졌을 때, 여행을 떠날 수 있는 그룹 수의 최댓값을 구하는 프로그램을 작성하세요. 예를 들어 N = 5이고, 각 모험가의 공포도가 다음과 같다고 가정합시다. 2 3 1 2 2 이 경우 그룹 1에 공포도가 ..
[이코테] 3. 그리디 알고리즘 - 곱하기 혹은 더하기
그리디 알고리즘 - 곱하기 혹은 더하기 문제 설명 각 자리가 숫자(0부터 9)로만 이루어진 문자열 S가 주어졌을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 'x' 혹은 '+' 연산자를 넣어 결과적으로 만들어질 수 있는 가장 큰 수를 구하는 프로그램을 작성하세요. 단, +보다 x를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서부터 순서대로 이루어진다고 가정합니다. 예를 들어, 02984라는 문자열로 만들 수 있는 가장 큰 수는 ((((0 + 2) x 9) x 8) x 4) = 576입니다. 또한 만들어질 수 있는 가장 큰 수는 항상 20억 이하의 정수가 되도록 입력이 주어집니다. 문제 해결 아이디어 두 수 중에서 하나라도 1 이하인 경우에는 더하며, 두 수가 모두 2 ..
[이코테] 3. 그리디 알고리즘 - 1이 될 때까지
그리디 알고리즘 - 1이 될 때까지 문제 설명 어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 합니다. 단, 두 번째 연산은 N이 K로 나누어 떨어질 때만 선택할 수 있습니다. N에서 1을 뺍니다. N을 K로 나눕니다. 예를 들어 N이 17, K가 4라고 가정합시다. 이때 1번의 과정을 한 번 수행하면 N은 16이 됩니다. 이후에 2번의 과정을 두 번 수행하면 N은 1이 됩니다. 결과적으로 이 경우 전체 과정을 실행한 횟수는 3이 됩니다. 이는 N을 1로 만드는 최소 횟수입니다. N과 K가 주어질 때 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성하시오. 문제 해결 아이디어 주어진 N에 대하여 "최대한 많이 나누기"..
[이코테] 3. 그리디 알고리즘 - 거스름 돈
그리디 알고리즘 - 거스름 돈 문제 설명 당신은 음식점의 계산을 도와주는 점원입니다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정합니다. 손님이게 거슬러 주어야 할 돈이 N원일 때 거슬러 주어야 할 동전의 최소 개수를 구하세요. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수입니다. 문제 해결 아이디어 " 가장 큰 화폐 단위 부터 " 돈을 거슬러 주면 됨. (최적의 해) N원 거슬러 줘야 할 때 가장 먼저 500원으로 거슬러 줄 수 있을 만큼 거슬러 줌. 이후에 100원, 50원, 10원짜리 동전을 차례대로 거슬러 줌. 정당성 분석 가장 큰 화폐 단위부터 거슬러 주는 것이 최적의 해가 되는 이유는? : 가지고 있는 동전 중에서 큰 단위가 항상 작은..