코딩테스트 23

[Softeer] [21년 재직자 대회 예선] 전광판

간만에 문제풀이,,,쉬운문제였는데 전광판 숫자 Map에서 5를 잘못입력해서 뭐가 틀렸는지 계속 찾느라 오래걸렸다..하드코딩해야 하는 부분이 있다면 여러번 확인해서 확실히 할것.. 내 소스import java.io.*;import java.util.*;public class Main { public static void main(String[] args) { HashMap map = new HashMap(); //전광판 숫자에 따른 불 ON/OFF map.put('0', "1110111"); map.put('1', "0010010"); map.put('2', "1011101"); map.put('3', "1011011");..

[알고리즘] 힙 정렬(heap sort)

힙은 '최솟값 또는 최댓값을 빠르게 찾아내기 위해 완전이진트리 형태로 만들어진 자료구조'다. 힙정렬에 대해 설명하기 위해서는 트리에 대해서 설명이 필요하다. 트리란?? 트리는 두 지점의 연결 관계로 구성되어 있는데, 계층관계가 존재한다는 것이 특징다. 우리는 하나의 연결 관계에서 위쪽에 있는 점을 부모라고 부르며, 아래쪽에 있는 점을 자식이라고 부를 것 입니다. 이 외에도 추가적인 용어들이 많은데, 아래쪽 사진을 참고하면서 용어를 이해해봅시다. 노드: 각 지점을 의미합니다. 루트 노드: 트리에서 맨 꼭데기를 의미합니다. 위쪽 조직도를 보면, 루트 노드는 회사 대표가 되겠죠? 부모, 자식: 트리에서 연결된 두 노드의 관계를 의미하는데, 더 위쪽에 있는 노드를 부모 노드, 아래쪽에 있는 노드를 자식 노드라고..

[알고리즘] 병합 정렬(merge sort)

퀵소트를 만나기전까지 제일 이해가 안됐던 병합정렬을 기록한다. 병합정렬이란?? 병합정렬은 분할정복(Divide & Conquer)정렬중 하나로, 특정 리스트를 분할하고, 정렬하여, 병합하는 일련의 과정을 거치며 정렬한다. 퀵 정렬은 피벗 값에 따라서 편향되게 분할할 가능성이 있다는 점에서 최악의 경우 O(N^2)의 시간 복잡도를 가지지만 병합 정렬은 정확히 반절씩 나눈다는 점에서 최악의 경우에도 O(N*logN)을 보장한다. 합병 정렬 또는 병합 정렬(merge sort)은 O(n log n) 비교 기반 정렬 알고리즘이다. 일반적인 방법으로 구현했을 때 이 정렬은 안정 정렬에 속하며, 분할 정복 알고리즘의 하나이다. 존 폰 노이만이 1945년에 개발했다. 하향식 합병 정렬에 대한 자세한 설명과 분석은 1..

[알고리즘] 퀵 정렬(quick sort)

정렬을 배우기 시작했다. 버블정렬, 선택정렬, 삽입정렬, 기수정렬, 병합정렬 등 다양한 정렬을 배웠다. (병합정렬이 가장 어려웠음) 코딩테스트 오픈카톡방에서 고수들끼리 하는 퀵 소트를 배울 차례가 됐다. 아무리 읽어도 도~저히 이해가 안되는것이다. 그러던중 유튜브에서 좋은 알고리즘 해석영상을 찾고 바로 이해가 되었다. https://www.youtube.com/watch?v=cWH49IKDIiI&ab_channel=%EC%BD%94%EB%94%A9%ED%95%98%EB%8A%94%EA%B1%B0%EB%8B%88 내가 이해한 퀵소트는 다음 순서를 따른다. pivot을잡는다. pivot이란 퀵소트에서 가장 중요한 개념으로, 쉽게말하면 기준을 잡는것이다. 위 영상과 코드트리에서는 배열 제일 마지막값을 pivo..

[코드트리] 수열의 순서 바꾸기

어려움 문제는 확실히 난이도가 높다........ 화이팅.. 1이상 N이하의 숫자가 겹치지 않게 구성된, 원소의 개수가 N개인 수열이 하나 주어졌을 때, 맨 앞에 있는 숫자를 선택해 수열 중간에 집어넣는 행동을 최소 몇 번 반복해야 숫자들이 오름차순 정렬이 되는지를 계산하는 프로그램을 작성해보세요. 입력 형식 첫 번째 줄에는 N이 주어집니다. 두 번째 줄에는 N개의 숫자가 공백을 사이에 두고 주어집니다. 1 ≤ N ≤ 100 출력 형식 첫 번째 줄에 수열을 오름차순으로 정렬하기 위해 맨 앞에 있는 원소를 뒤로 밀어 넣어야 하는 최소 횟수를 출력합니다. 입출력 예제 예제1 입력: 4 1 2 4 3 출력: 3 예제 설명 처음 숫자 1을 4와 3 사이로 옮기면 2 4 1 3이 됩니다. 그 다음 숫자 2를 1과..

[코드트리] 홀수 짝수의 묶음

간만에 봐도 잘 이해가안되는 문제가 생겨서 기록한다.. 그리고 기간이 얼마안남아서,, 흑흑 증말 어렵다 N개의 숫자들이 주어지면 주어진 숫자들을 전부 사용하여, 각 묶음으로 나눠 각각의 합을 구했을 때 첫 번째 묶음부터 순서대로 그 합이 짝수, 홀수, 짝수, 홀수, 짝수, … 이렇게 짝수에서 시작하여 짝홀이 계속 번갈아가면서 나오게끔 하는 만들 수 있는 최대 묶음 수를 구하는 프로그램을 작성해보세요. 단, 주어진 순서에 상관없이 묶음을 만들어도 됩니다. 입력 형식 첫 번째 줄에는 주어지는 숫자의 개수 N이 주어집니다. 두 번째 줄에는 N개의 숫자가 공백을 사이에 두고 주어집니다. 2 ≤ N ≤ 1,000 1 ≤ 주어지는 숫자들 ≤ 100 출력 형식 첫 번째 줄에 짝홀이 계속 번갈아가면서 나오게끔 하는 만..

[코드트리] 세 수의 최대 곱

어려운 문제는 아니다, 시간복잡도를 벗어나는 이슈를 피해 적당한 값을 추려놓고 그 중에 선택을 하는 문제이다. 배우지 않았으면 풀지 못했을 문제일것같아 기록함 정수 n과 n개의 수가 주어졌을 때, 3개의 숫자를 적절하게 골라 나올 수 있는 곱 중 최대값을 구하는 프로그램을 작성해보세요. 입력 형식 첫 번째 줄에 정수 n이 주어집니다. 두 번째 줄에 n개의 정수가 공백을 사이에 두고 주어집니다. 3 ≤ n ≤ 100,000 -1,000 ≤ 주어지는 수 ≤ 1,000 출력 형식 첫 번째 줄에 3개의 숫자를 적절하게 골라 나올 수 있는 곱 중 최대값을 출력합니다. 입출력 예제 예제1 입력: 12 10 -5 -2 4 -9 15 -3 6 0 7 1 -20 출력: 2700 예제 설명 -20, -9, 15를 추출하여..

[코드트리] ABC 줄 세우기

난이도는 낮지만 나중에 꼭 다시 사용할 알고리즘일것 같아 기록한다. 이것 외에도 최소값의 최댓값, 최댓값의 최솟값에 대한 알고리즘은 반드시 다시 숙지할것. 처음에 n명의 사람이 서있는 순서가 A부터 순서대로 알파벳으로 주어지면 알파벳 순으로 줄을 세우려고 합니다. 단, 순서대로 줄을 세우기 위해서는 인접한 두 사람의 위치를 계속 바꾸는 행위만 가능하다고 할 때, 가능한 최소 횟수를 구하는 프로그램을 작성해보세요. 예를 들어 4명의 사람이 서있는 순서가 A D C B와 같이 주어지면, A, B, C, D 순으로 줄을 세워야 합니다. 입력 형식 첫 번째 줄에 정수 n이 주어집니다. 두 번째 줄에 n명의 사람이 서있는 순서가 알파벳으로 공백을 사이에 두고 주어집니다. 1 ≤ n ≤ 26 출력 형식 첫 번째 줄..

[코드트리] X 달리기

이번에도 일어난 상황에 대해서 추론을 하여 적합한 답을 출력하는 문제다. 가야하는 거리가 주어지고, 시작속도를 1m/s로 시작해서 특정거리를 도달할때 다시 속도가 1m/s이여야 한다. 선택하여 속도를 1씩 늘리거나, 유지하거나, 1씩줄일수 있다. 가야하는 거리까지 가는데 가장 최단시간을 구해야한다. 오늘 뭔가 문제가 잘풀린다.. 나는 추론에 강한가,,, 후후후후,,,, Xm 만큼 달리기를 진행하려 합니다. 1m/s로 시작하되, 1초에 한 번씩 속도를 유지할 것인지, 1m/s 만큼 증가시킬 것인지, 1m/s 만큼 감소시킬 것인지를 결정할 수 있습니다. 단, 도착지에 도달하는 순간의 속력은 꼭 1m/s가 되어야만 합니다. 가능한 최단 시간을 구하는 프로그램을 작성해보세요. 단, 이동하는 도중 0m/s가 되어..

[코드트리] 코딩톡

일어난 상황에 대해서 추론을 하여 적합한 답을 출력하는 문제다. 메신저를 보낸사람과, 그 메시지를 보지않은 사람의 수들의 목록이 주어졌을때, 특정시점에서 해당 메시지를 읽지 않을 가능성이 있는사람을 출력하는 문제이다.. 어려움 난이돈데 금방 풀어서 기분이 좋고,, 아직 배우지는 않았지만 역탐색을 이용해서 처음 푼 문제이기때문에 기록한다. n명의 프로그래머들이 서로 채팅으로 대화할 수 있는 메신저방인 코딩톡에 초대되었습니다. 코딩톡 사람들의 이름은 'A'부터 n개의 대문자 알파벳이 순서대로 붙여져 있으며, 서로 대화를 하고 있습니다. 누군가 메신저방에 들어오게 되면, 이전에 보내진 모든 메세지를 읽게 됩니다. 각 프로그래머들이 언제 들어왔다가 나갔는지에 대한 정보는 전혀 없지만, 총 m개의 해당하는 메세지..