본문 바로가기

알고리즘(Algorithm)

(93)
[C++] 센서 (2212번) https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net 문제풀이 사고력이 필요한 문제다. 문제를 간단히 요약해보면, N개의 센서가 정수 좌표이 있으며 중복해 있을 수 있다. K개의 집중국이 있고 집중국은 아무데나 놔도 되고 모든 센서를 수신하면서 수신 가능영역이 최소인 위치에 놓아야 한다. 문제 접근은 이런 방식으로 해 보았다. 센서가 이리저리 놓여있을 텐데, 어느 지점 마다 끊어서 집중국을 설치해야 할까? 센서 사이의 거리가..
[C++] 문자열 복사 (2195번) https://www.acmicpc.net/problem/2195 2195번: 문자열 복사 첫째 줄에 S, 둘째 줄에 P가 주어진다. S와 P는 영어 대소문자와 숫자로만 되어 있다. S의 길이는 1,000을 넘지 않으며, P의 길이는 1,000을 넘지 않는다. copy함수만을 이용하여 S에서 P를 만들어낼 수 www.acmicpc.net 문제풀이 처음에 그냥 문자열 무지성으로 비교하면 되려나? 시간 초과나지 않을까? 어떻게 푸는거야. 라는 생각을 하다가 결국 다른 사람이 어떻게 풀었나 살짝 봤다. 그런데 진짜 그냥 하나하나 비교하더라. 왜 다 비교하는데 시간초과가 안날까? 일단 풀이 방법을 먼저 보자. bdx 라는 변수를 지정하고, 이 bdx가 p의 길이보다 작을 때 까지 while문을 돌린다. 이 wh..
[C++] 체인 (2785번) https://www.acmicpc.net/problem/2785 2785번: 체인 희원이는 그의 다락방에서 N개의 체인을 찾았다. 각각의 체인은 몇 개의 고리로 연결되어 있는데, 각각의 고리는 최대 두 개의 인접한 고리를 가질 수 있다. 각각의 고리는 열고 닫을 수 있다. 그 www.acmicpc.net 문제풀이 그리디 쉽지않다. 코드는 정말 간단한데 구현 과정을 생각하는게 어렵다. 고려해야 할 점은, 1 1 1같이 주어 졌을 때 하나의 고리만 열면 모든 체인이 연결된다는 점이다. 즉 체인의 고리를 모두 소모하는 경우 연결해야 할 체인이 하나 줄어든다는 점이 핵심이다. 받은 입력을 정렬해서, 가장 짧은 체인의 고리를 하나씩 떼서 가장 긴 두 체인을 연결하는데 사용하는 방법을 생각했다. 만약 가장 짧은 ..
[C++] Yonsei TOTO (12018번) https://www.acmicpc.net/problem/12018 12018번: Yonsei TOTO 연세대학교 수강신청이 얼마 전부터 바뀌어, 마일리지 제도로 바뀌었다. 이 제도는 각각의 학생들에게 마일리지를 주어 듣고 싶은 과목에 마일리지를 과목당 1~36을 분배한다. 그리고 모두 분배 www.acmicpc.net 문제풀이 각 과목에 최소한의 마일리지를 이용해서 최대한의 과목을 수강하는 것이 목적이다. 주의할 조건 몇가지를 알아보자, 마일리지는 한 과목에 1~36점을 넣을 수 있다. 0점 못넣는다. 점수가 같으면 성준이가 먼저 수강한다. 풀이 과정은 아래와 같다. 1. 과목별 수강신청을 위한 최소 마일리지를 저장할 배열을 만든다. 2. 각 과목별 최소 마일리지를 구하는데 만약 지원자보다 수강가능 인..
[JavaScript] 귤 고르기 (프로그래머스 LEVEL 2) https://school.programmers.co.kr/learn/courses/30/lessons/138476?language=javascript 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제풀이 쏘카 코테 보려고 JS로 풀어봤다. 좀 편한데? object에 귤 크기를 key, 귤 개수를 value로 해서 크기별 개수를 구한다. 크기만 빼서 배열로 만들고, 크기 순으로 내림차순을 한다. 반복문 돌면서 k에서 해당하는 값을 빼준다. 그리고 정답을 1 증가시킨다. k가 0보다나 작거나 같아지면 반복을 멈춘다. 이렇게 하면 크기가 서로다른 종류의 수..
[C++] 동전 (9084번) https://www.acmicpc.net/problem/9084 9084번: 동전 우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는 www.acmicpc.net 문제풀이 역시 dp문제.. 풀때마다 새롭고 풀때마다 머리아프다. 나만의 방법을 좀 터득했다면, 일단 이차원 배열로 만들어 생각해 보는것이다. 처음 예제를 예로 들어보자. 1, 2 원짜리 동전이 있다. 행을 동전, 열을 총 금액이라고 보고 표를 보자. 주의할점이 하나 있는데, 동전 1 2 와 2 1은 하나로 취급해야 한다. 1 2 3 4 5 6 7 8 9 1 1 1 1 2 1 2 3..
[C++] 네트워크 연결 (1922번) https://www.acmicpc.net/problem/1922 1922번: 네트워크 연결 이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다. www.acmicpc.net 문제풀이 보자마자 딱! MST 를 만들면 되겠구나 라고 생각했다. MST를 만드는 알고리즘은 여러가지가 있는데 그중에 kruskal 알고리즘을 사용하기로 했다. 예전에 해본적이 있어서 이걸 사용했다. union-find 알고리즘을 그대로 사용하면된다. 크루스컬 알고리즘의 핵심을 weight별로 정렬하여 cycle이 발생하지 않는 edge를 추가하는 것이다. union-find 알고리즘으로 cycle 발생 여부를 체크해가며 edge를 추가하면 쉽게 구현할 수 있다. 1. 입력받은 edge..
[C++] 먹을 것인가 먹힐 것인가 (7795번) https://www.acmicpc.net/problem/7795 7795번: 먹을 것인가 먹힐 것인가 심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을 www.acmicpc.net 문제풀이 n과 m의 크기가 최대 20000이므로, 완전탐색을 하면 시간초과가 발생할 것이라고 생각했다. 더 좋은 방법을 생각하던중, 두 값을 정렬한 뒤 a를 순회하며 b에 이분탐색을 한 뒤 인덱스를 이용해서 더 작은 값의 개수를 구할 수 있다고 생각했다. 풀이 방법이 바로 떠올라서 풀었는데, 이분탐색에서 막혀버렸다. 맨날 공식처럼 그냥 "값이 있..