개발/알고리즘 38

프로그래머스_달리기 경주

■ 해결 방법callings에 있는 값을 players에 순회해서 찾으려면 50,000 * 1,000,000의 시간복잡도가 소요된다. 따라서 O(n) 이하의 시간 복잡도로 풀 수 있는 방법을 찾아야 한다. 나는 players의 있는 값들을 순위를 매겨주었다. { mumu : 1, soe : 2, poe : 3, kai : 4, mine : 5} 이런식으로 해준 다음 callings에 불린 값과 그 앞의 값의 순서를 바꿔주는 형태로 진행했다. 이 때 주의해야 할 것은 players의 순서만 바꾸어 주는 것이 아닌, 순위도 값이 변경해주어야 하는 것이다.  ■ 코드 function solution(players, callings) { var answer = []; let playersDict =..

개발/알고리즘 2024.05.03

프로그래머스_개인정보 수집 유효기간

■ 해결 방법문자열을 잘 가지고 놀아야 하는 문제이다.  계산된 개인정보 약관과 현재 날짜를 비교를 하면 되는데, 구조화를 잘 해놓기만 하면 쉽게 풀 수 있다. ■ 코드 function solution(today, terms, privacies) { var answer = []; let map = new Map(); for(key in terms){ map.set(terms[key].substr(0, 1),Number(terms[key].split(' ')[1])) } for(key in privacies){ let year = Number(privacies[key].substr(0,4)) let month = Number(privacies..

개발/알고리즘 2024.05.02

프로그래머스_[PCCP 기출문제] 1번 / 붕대 감기

■ 해결 방법health 감소에 영향을 주는 상황은 attacks이 있을 때 발생한다. 그러므로 health가 감소하는 상황을 이용해 health를 구한다. 최대 체력이 정해져 있기 때문에, 체력 감소 + 붕대로 체력 회복 패턴을 반복한다. 연속 성공 했을 때, 추가 회복량을 주는 것만 중간에 조건을 끼워서 계산하면 비교적 쉽게 해결할 수 있다.  ■ 코드 function solution(bandage, health, attacks) { var answer = 0; let max_health = health; health = health - attacks[0][1]; for(let i = 1; i = bandage[1]) extraPoint = Math.floor(duration /..

개발/알고리즘 2024.05.01

프로그래머스_겹치는 선분의 길이

■ 해결 방법 처음에는 점끼리 겹치는 선분의 길이를 더해서 구하려고 했으나, 세개의 선분이 동시에 겹칠 때를 계산하기 위해서 너무 복잡해졌다. 알고리즘은 더 효율적인 방법으로 모색해야 하므로 다른 방법을 고민해보았다. 색칠로 비유해보자면 일직선에 1 단위로 칸이 나누어져있고 해당 칸에 색칠을 해준다는 느낌으로 생각을 해보았다. 그러면 여러번 색칠 된 것이 답이 될 것이다. 길이가 200인 일차원 배열을 선언해주고 값을 0으로 채웠다. 이후 lines의 배열을 순회하며 일차원 배열의 값을 채워갔다. 예를 들어, lines[0]의 값이 [0, 1] 일 때, 일차원 배열 line의 값은 line[0] =1이 된다. 이런식으로 line 배열의 값을 채우고 마지막에 1보다 큰 값을 카운트 해주면 된다. ■ 코드 ..

개발/알고리즘 2024.04.22

프로그래머스_평행

■ 해결 방법 기울기를 구하는 공식을 이용해 점과 점의 기울기를 구해준다. 이 때, 점이 고정되어 있는 것이 아니라 어디에 있을 줄 모르므로 점이 올 수 있는 위치에 대한 경우의 수를 구한다. 이 때, 3C2 즉 3가지의 경우의 수가 있다. 이 3가지 위치에 점들의 기울기를 비교해주면 된다. ■ 코드 function func_lean(x1, y1, x2, y2){ var x; var y; if(x1 < x2) x = x2 - x1 else x = x1 - x2; if(y1 < y2) y = y2 - y1 else y = y1 - y2; return x / y; } function solution(dots) { var answer = 0; console.log(dots); if(func_lean(dots[..

개발/알고리즘 2024.04.19

프로그래머스_구명보틀

https://programmers.co.kr/learn/courses/30/lessons/42885 코딩테스트 연습 - 구명보트 무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5 programmers.co.kr 그리디 문제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include #include #include using namespace std; bool comp(int a, int b){ return a > b; } int solution(vector ..

개발/알고리즘 2021.08.26

프로그래머스위클리챌린지_직업군 추천하기(4주차)

https://programmers.co.kr/learn/challenges 코딩테스트 연습 기초부터 차근차근, 직접 코드를 작성해 보세요. programmers.co.kr 1234567891011121314151617181920212223242526272829303132333435363738#include #include #include #include #include using namespace std; string solution(vector table, vector languages, vector preference) { string answer = ""; vector domain_list = { "CONTENTS", "HARDWARE", "PORTAL", "SI", "GAME"}; vector ..

개발/알고리즘 2021.08.26

[알고리즘]나머지성질을 이용한 문제

해당 문제는 큰 수의 나머지를 구하는 문제였다. 나는 계속 큰 수를 실수형으로 바꾸려고 했는데, 그렇게 하면 안되고 한 자리 수 계속 구할 때 나머지를 구해줘야 했다. 예를 들어, for(int i = 0; i < str_AtoN.size(); i++){ tmp = str_AtoN[i] - '0'; sum = (sum * 10) + tmp; } // 이 아니라 sum 에 계속 나머지 연산을 해주어야 한다. for(int i = 0; i < str_AtoN.size(); i++){ tmp = str_AtoN[i] - '0'; sum = ((sum * 10) + tmp) % 97; } 이제 1번도 제대로 못푼다. 매일 꾸준히 풀어보자.

개발/알고리즘 2021.08.12

1780_종이의 갯수

https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다. www.acmicpc.net 분할 정복법으로 푼 종이의 갯수 문제. 분할을 한 다음 다 종이에 다 똑같은 숫자가 적혀있는지 확인하는 문제이다. 큰 논리 흐름은 이렇다. 검사를 Check 함수에서 똑같은게 없는지 검사했고, 9등분은 시작점과 매번 3분의 1로 작아지는 사이즈를 이용하여 풀었다. 123456789101112131415161718192021222324252627282930313233343536373839..

개발/알고리즘 2020.12.20

1645_랜선 자르기

https://www.acmicpc.net/problem/1654 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 www.acmicpc.net 이분검색을 이용하여 랜선을 자르는 문제이다. 다합쳐서 나누기를 하는 방법을 처음 생각해봤는데 제대로 된 답이 안나왔다. 그렇다면 기존의 랜선 중 하나를 정해서 이분 탐색을 이용해 수를 찾아서 정답을 도출하는 방법이 생각이 났다. 몇가지 오류가 있어서 사람들꺼 참조해보니 논리는 잘 되었지만 몇가지 부분에서 잘못된 것이 있었다. * 내가 짜놓은 코드는 첫번째로 만족하면 바..

개발/알고리즘 2020.12.08