본문 바로가기

프로그래머스lv263

[프로그래머스 lv2] 스킬 트리 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 문자열 s가 스킬 순서를 만족하는지 확인하는 과정은 다음과 같다. 1) 문자열 s를 순회하면서 각 문자가 주어진 skill 에 포함되어있는지 확인한다. 2) skill에 포함되어있다면, 스킬 중 몇번째 순서인지 인덱스를 확인하여 기록해놓는다. 3) 문자열을 모두 순회하고 기록된 인덱스를 보았을 때, 기록된 인덱스는 0부터 시작하고 1씩 증가하는 오름차순 배열이어야 한다. 해당 조건을 만족한다면 스킬 순서를 지키는 문자열로, 만족하지 않는다면 스킬 순서를 지키지 않은 문자열로 판단한다. skill_trees로 주어진 문자열 중에서 스킬 순서를 지키는 문자열의 개수를 리턴하면 정답이다. 코드 #include #include #include #include.. 2022. 8. 25.
[프로그래머스 lv2] 배달 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 1번 노드에서 각 노드까지의 거리를 구한 후, 거리가 K이하인 노드의 개수를 세는 문제이다. 그래프에서 노드끼리의 거리를 구하기 위해서는 다음 세가지 알고리즘을 사용할 수 있다. 1) 다익스트라 2) 벨만-포드 3) 플로이드 와샬 입력값의 범위가 50 이하이므로 O(v^3)의 시간 복잡도가 가능하다. 구현이 간단한 플로이드 와샬을 통해 각 노드까지의 거리를 구해보자. (참고: 최단거리구하기_플로이드 와샬(Floyd Warshall) 알고리즘) dp[i][j]는 i에서 j까지의 최단 거리이므로, dp[1][j] 값이 K이하인 노드의 개수를 세고 리턴하면 정답이다. 코드 #include #include #include #include #include #i.. 2022. 8. 25.
[프로그래머스 lv2] 쿼드 압축 후 개수 세기 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 주어진 정사각형의 한변의 길이를 n이라 할 때, n x n 정사각형을 4개로 나누어가며 압축하는 문제이다. 정사각형의 한 변의 길이는 n -> n/2 -> n/4 -> ... -> 1 이 되는데, 해당 과정을 재귀로 처리할 수 있다. func(int x, int y, int n)은 왼쪽 위 꼭짓점이 (x, y)이고 한변의 길이가 n인 정사각형에 대하여, 쿼드 압축 결과를 구하는 함수이다. 만약, 해당 정사각형이 모두 같은 수로 이루어져있다면 그 수의 개수를 1 증가시킨다. 만약, 해당 정사각형이 모두 같은 수로 이루어져있지않다면, 한변의 길이가 n/2인 4개의 정사각형으로 나누어 재귀적으로 쿼드 압축 결과를 구한다. 4개 정사각형의 각 꼭직점은 (x,.. 2022. 8. 25.
[프로그래머스 lv2] N-Queen 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 Queen 들을 배치하기 전 알아두면 좋은 사항들이 있다. 1. Queen은 한 행에 하나씩만 위치한다. : 같은 행에 두 개 이상의 Queen이 있으면 서로를 공격할 수 있기 때문이다. : 따라서, 우리는 0행부터 n-1행까지의 퀸에 대해 열만 결정하면 된다. 2. Queen의 열의 결정할 때 고려해야 할 사항은 세 가지이다. (1) 이전에 선택했던 열을 재선택할 수 없다. : 같은 열에 두 개 이상의 Queen이 있으면 서로를 공격하기 때문이다. (2) 이전에 선택한 좌표가 공격할 수 있는 오른쪽 대각선을 피해야 한다. : 같은 대각선에 두 개 이상의 Queen이 있으면 서로를 공격하기 때문이다. : 이전에 선택한 퀸 좌표가 (x, y)라고 할 때.. 2022. 8. 24.
[프로그래머스 lv2] 삼각 달팽이 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 방향을 회전하며 좌표를 지나는 전형적인 시뮬레이션 문제이다. 삼각형에서 규칙을 찾아보면, n칸, n-1칸, n-2칸, ... 1칸씩 같은 방향으로 이동하면서 0번, 1번, 2번으로의 회전이 반복된다. 따라서 i = n 부터 i = 1까지 외부 반복문을 수행하면서 내부에서는 i칸만큼 같은 방향으로 이동하고 숫자를 기록하면 된다. 이 때, i번째 칸을 이동할 때는 방향이 전환되므로, 방향 변수 dir을 다음 회전 방향으로 변경하여 이동하도록 한다. 초기 좌표를 x = 0, y = 0 이라고 했을 때, 0번 방향으로의 움직임은 (+1, -0.5), 1번 방향으로의 움직임은 (0, +1), 2번 방향으로의 움직임은 (-1, -0.5)가 된다. 좌표를 이동하면.. 2022. 8. 24.
[프로그래머스 lv2] 전력망을 둘로 나누기 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 트리는 정점이 V, 간선이 V-1개 이고 사이클이 없는 그래프이다. 주어진 wires 중에 한개를 골라 자르면 해당 트리는 두개의 트리로 나누어지게 된다. wires를 순회하면서 각 와이어를 끊고, 와이어에 연결된 정점 중 하나를 시작지점으로 트리를 탐색하자. 첫번째 트리를 구성하는 노드 개수가 cnt개 일 때, 나머지 트리의 노드 개수는 n-cnt가 된다. 두 트리의 노드 차 cnt-(n-cnt)의 최솟값을 리턴하면 정답이다. 코드 #include #include #include #include #include #include #include #include #include #include #include #include #include #inclu.. 2022. 8. 23.
[프로그래머스 lv2] 교점에 별 만들기 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 line의 원소 개수가 1000개 이하이므로, 두 직선을 선택하여 가능한 모든 교점을 구해도 TLE가 발생하지 않는다. 두 개의 직선에 대하여 교점 (x, y)를 구한 뒤 중복없이 원소를 저장하는 set에 넣어놓자. (x는 세로, y는 가로) 교점을 포함하는 좌표평면을 리턴할 때, 교점의 최솟값과 최댓값을 감싸는 범위 내에서만 좌표평면을 구성하면 된다. 교점의 x좌표와 y좌표에 대해 각각 최댓값, 최솟값을 구한 후, 해당 크기만큼의 보드를 만들자. 교점 (x, y)는 새로운 보드에서 (mnx-x, y-mny)가 되므로 해당 위치에 표시하여 리턴하면 정답이다. 주의 할 것 좌표를 구하는 과정에서 int 범위를 넘어갈 수 있기 때문에 long long 자.. 2022. 8. 23.
[프로그래머스 lv2] 구명보트 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 무게 제한이 limit인 구명보트에 가능한 많은 사람들을 타게 하려면, 가장 무거운 사람과 가장 가벼운 사람이 같이 타야 한다. people을 오름차순으로 정렬했을 때, 0번부터 오른쪽으로 이동하는 인덱스를 l, 마지막원소부터 왼쪽으로 이동하는 인덱스를 r 이라고 하자. people[l]+people[r]이 limit 보다 작거나 같다면 두 사람은 한 보트에 탈 수 있는 것이므로 l과 r을 각각의 방향으로 1씩 움직인다. 두 무게의 합이 limit 보다 크다면 두 사람은 한 보트에 탈 수 없는 것이므로 더 무거운 people[r]만 보트에 넣는다고 생각하고 r만 1 감소시킨다. l이 r보다 작을 때까지 위의 과정을 반복한 후, l과 r이 같다면 남는 .. 2022. 8. 23.
[프로그래머스 lv2] 다리를 지나는 트럭 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 다리의 길이 bridge_length, 최대 수용 무게 weight가 주어졌을 때, 모든 트럭을 이동시키기 위한 최소 시간을 구하는 문제이다. 다리에 올라온 트럭은 먼저 올라온 순서대로 다리를 빠져나간다. 따라서 다리를 queue로 표현하면 큐의 앞쪽에서 트럭을 제거하고 뒤쪽에 새로운 트럭을 추가함으로써 간단하게 이동 상태를 표현할 수 있다. queue의 길이가 bridge_length와 같을 때 가장 앞쪽에 있는 트럭이 다리를 빠져나가므로 이를 큐에서 제거한다. 현재 다리에 있는 트럭의 총 무게와 새로운 트럭 무게의 합이 주어진 weight 보다 작거나 같다면 새로운 트럭을 queue에 추가한다. queue는 배열과 다르게 길이가 보장되지 않으므로,.. 2022. 8. 23.
[프로그래머스 lv2] 예상 대진표 풀이 ✅ 프로그래머스의 모든 문제와 해설 보기[클릭] 해설 특정 라운드에서 a와 b가 대결 상대인지 확인하려면 (a-1)/2 와 (b-1)/2가 같은지 비교하면 된다. 예를 들어, a = 5 이고 b = 6 일 때 (5-1)/2 = 2, (6-1)/2 = 2 이므로 둘은 대결 상대이다. n을 반으로 줄여가며 round를 1씩 증가시키고, a와 b를 새로운 포지션 (a+1)/2, (b+1)/2 로 조정한다. 특정 라운드에서 a와 b가 대결상대라면 해당 라운드를 리턴하면 된다. 코드 #include #include #include #include #include #include #include #include #include #include #include #include #include #include usin.. 2022. 8. 22.