Algorithm(52)
-
[python] 백준 1920 :: 수 찾기 (이분 탐색)
[수 찾기] # 문제 N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. # 입력 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다. # 출력 M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다. 풀이 n_list = set(map(int, input().split())) m = input() m_list = l..
2023.03.09 -
[python] 백준 6603 :: 로또 (백트래킹 풀이, itertools 풀이)
[로또] # 문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다. 예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34]) 집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오. # 입력 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루..
2023.03.09 -
[python] 백준 2503 :: 숫자 야구 (백트래킹 풀이, itertools 풀이)
[숫자 야구] # 문제 정보문화진흥원 정보 영재 동아리에서 동아리 활동을 하던 영수와 민혁이는 쉬는 시간을 틈타 숫자야구 게임을 하기로 했다. 영수는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 마음속으로 생각한다. (예: 324) 민혁이는 1에서 9까지의 서로 다른 숫자 세 개로 구성된 세 자리 수를 영수에게 묻는다. (예: 123) 민혁이가 말한 세 자리 수에 있는 숫자들 중 하나가 영수의 세 자리 수의 동일한 자리에 위치하면 스트라이크 한 번으로 센다. 숫자가 영수의 세 자리 수에 있긴 하나 다른 자리에 위치하면 볼 한 번으로 센다. 예) 영수가 324를 갖고 있으면 429는 1 스트라이크 1 볼이다. 241은 0 스트라이크 2 볼이다. 924는 2 스트라이크 0 볼이다. 영수는 ..
2023.03.09 -
[python] 백준 1110 :: 더하기 사이클
[더하기 사이클] # 문제 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자. 26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다. 위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다. N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작..
2023.03.09 -
[python] 백준 14888 :: 연산자 끼워넣기 (eval 함수 성능 비교)
[연산자 끼워넣기] # 문제 N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다. 예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 2개, 뺄셈(-) 1개, 곱셈(×) 1개, 나눗셈(÷) 1개인 경우에는 총 60가지의 식을 만들 수 있다. 예를 들어, 아래와 같은 식을 만들 수 있다. 1+2+3-4×5÷6 1÷2+3+4-5×6 1+2÷3×4-5+6 1÷2×3-4+5+6 ..
2023.03.08 -
[python] 백준 10971 :: 외판원 순회 2
[외판원 순회 2] # 문제 외판원 순회 문제는 영어로 Traveling Salesman problem (TSP) 라고 불리는 문제로 computer science 분야에서 가장 중요하게 취급되는 문제 중 하나이다. 여러 가지 변종 문제가 있으나, 여기서는 가장 일반적인 형태의 문제를 살펴보자. 1번부터 N번까지 번호가 매겨져 있는 도시들이 있고, 도시들 사이에는 길이 있다. (길이 없을 수도 있다) 이제 한 외판원이 어느 한 도시에서 출발해 N개의 도시를 모두 거쳐 다시 원래의 도시로 돌아오는 순회 여행 경로를 계획하려고 한다. 단, 한 번 갔던 도시로는 다시 갈 수 없다. (맨 마지막에 여행을 출발했던 도시로 돌아오는 것은 예외) 이런 여행 경로는 여러 가지가 있을 수 있는데, 가장 적은 비용을 들이..
2023.03.08 -
[python] 백준 10819 :: 차이를 최대로
[차이를 최대로] # 문제 N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오. |A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]| # 입력 첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다. # 출력 첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.풀이 전체 코드 - 1) itertools 활용 from itertools import permutations _ = input() m = 0 for a i..
2023.03.08 -
[python] 백준 2798 :: 블랙잭 (itertools vs for문 비교)
[블랙잭] # 문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다. N장의 카드에 써져 있는 숫자가 ..
2023.03.08 -
[python] 백준 2309 :: 일곱 난쟁이
[일곱 난쟁이] # 문제 왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오. # 입력 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다. # 출력 일곱 난쟁이의 키를 오름차순으로 출..
2023.03.08 -
[python] 백준 1181 :: 단어 정렬
[단어 정렬] # 문제 알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오. 길이가 짧은 것부터 길이가 같으면 사전 순으로 단, 중복된 단어는 하나만 남기고 제거해야 한다. # 입력 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. # 출력 조건에 따라 정렬하여 단어들을 출력한다.풀이 전체 코드 import sys words = [sys.stdin.readline().strip() for _ in range(int(input()))] def func(w): return len(w), w [print(..
2023.03.08 -
[python] 백준 10989 :: 수 정렬하기 3 (도수 정렬, 계수 정렬)
[수 정렬하기 3] 🚨 메모리 제한이 8M이다. 문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. 출력 첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다. 풀이 전체 코드 import sys N = int(input()) # 인덱스에 해당하는 숫자의 개수를 값으로 담을 배열 count = [0] * 10001 # count의 배열에서 정렬할 숫자의 인덱스에 해당하는 값을 1씩 증가한다. for _ in range(N): count[int(sys.stdin.readline())]..
2023.03.07 -
[python] 백준 1074 :: Z
[Z] # 문제 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다. N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오. # 입력 첫째 줄에 정수 N, r, c가 주어진다. # 출력 r행 c열을 몇 번째로 방문했는지 출력한다. 풀이 전체 코드 N, r, c = map(int, input().split()) def recursive(n, row, col): if n == 0: return 0 cur_count = 2 * (row % 2) + ..
2023.03.07 -
[python] 백준 9663 :: N-Queen 👑
[N-Queen] # 문제 N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오. # 입력 첫째 줄에 N이 주어진다. (1 ≤ N < 15) # 출력 첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다. 풀이 전체 코드 N = int(input()) # row[행_idx] == True면 퀸이 있는 행 row = [False] * N # 열_idx + 행_idx == True면 퀸이 있음 right_cross = [False] * (2 * N - 1) # 열_idx - 행_idx + N-1 == True면 퀸이 있음 left_cross = [False] * (2 * N..
2023.03.07 -
[python] 백준 5568 :: 카드 놓기 (재귀 함수 vs itertools 비교)
[카드 놓기] # 문제 상근이는 카드 n(4 ≤ n ≤ 10)장을 바닥에 나란히 놓고 놀고있다. 각 카드에는 1이상 99이하의 정수가 적혀져 있다. 상근이는 이 카드 중에서 k(2 ≤ k ≤ 4)장을 선택하고, 가로로 나란히 정수를 만들기로 했다. 상근이가 만들 수 있는 정수는 모두 몇 가지일까? 예를 들어, 카드가 5장 있고, 카드에 쓰여 있는 수가 1, 2, 3, 13, 21라고 하자. 여기서 3장을 선택해서 정수를 만들려고 한다. 2, 1, 13을 순서대로 나열하면 정수 2113을 만들 수 있다. 또, 21, 1, 3을 순서대로 나열하면 2113을 만들 수 있다. 이렇게 한 정수를 만드는 조합이 여러 가지 일 수 있다. n장의 카드에 적힌 숫자가 주어졌을 때, 그 중에서 k개를 선택해서 만들 수 있..
2023.03.07 -
[python] 백준 2628 :: 종이자르기
종이자르기 # 문제 아래 과 같이 직사각형 모양의 종이가 있다. 이 종이는 가로방향과 세로 방향으로 1㎝마다 점선이 그어져 있다. 가로 점선은 위에서 아래로 1번부터 차례로 번호가 붙어 있고, 세로 점선은 왼쪽에서 오른쪽으로 번호가 붙어 있다. 점선을 따라 이 종이를 칼로 자르려고 한다. 가로 점선을 따라 자르는 경우는 종이의 왼쪽 끝에서 오른쪽 끝까지, 세로 점선인 경우는 위쪽 끝에서 아래쪽 끝까지 한 번에 자른다. 예를 들어, 의 가로 길이 10㎝이고 세로 길이 8㎝인 종이를 3번 가로 점선, 4번 세로 점선, 그리고 2번 가로 점선을 따라 자르면 와 같이 여러 개의 종이 조각으로 나뉘게 된다. 이때 가장 큰 종이 조각의 넓이는 30㎠이다. 입력으로 종이의 가로 세로 길이, 그리고 잘라야할 점선들이 ..
2023.03.07 -
[python] 백준 9020 :: 골드바흐의 추측 (소수 찾기, 소수 배열 짱 빨리 만들기)
소수 찾기: 배수 제거 방식 소수를 찾을 때 에라토스테네스의 체를 이용하는 방법보다 더 빠르게 찾을 수 있는 방법이 있다. 1부터 소수를 찾아나가면서, 배수를 지워버리는 방법이다. 숫자의 배수들은 소수가 아니므로, 소수인지 검증하기 위해 다른 숫자들로 나눠볼 필요가 없다!! 전체 코드 prime = [] # 소수를 담을 배열 check = [False]+[False] + [True] * 9999 # index에 해당하는 숫자가 소수일 때만 True를 담을 배열 # 2부터 10000까지 소수 찾기 시작~! for number in range(2, 10001): if check[number]: # True가 담겨있으면 소수임! 👉🏻 prime 배열에 추가한다. prime.append(number) # 찾은 ..
2023.03.07 -
[python] 백준 1065 :: 한수 (숫자의 각 자릿수 구하기)
숫자가 주어졌을 때, 각 자리의 수를 구하려면 숫자를 문자열로 바꾸고 문자열 = str(숫자) 문자열[0]처럼 각 인덱스에 접근해도 되지만, 이렇게 분리한 각 자릿수로 사칙연산을 하려면 또 int로 변환해줘야 한다. 아주 귀찮음..🤮 숫자 상태에서 타입 변환 없이 계산을 통해서 각 자릿수를 더 빠르게 구할 수 있다!! 숫자의 각 자릿수 구하기 # 각 자릿수를 찾으려는 값 N = 369 # 100의 자리: 100으로 나눈 몫 N100 = N // 100 # 10의 자리: 100으로 나눈 나머지를 10으로 나눈 몫 N10 = N % 100 // 10 # 1의 자리: 10으로 나눈 나머지 N1 = N % 10 👇🏻 문제에 적용 ㄱㄱ [한수] 문제 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 ..
2023.03.07 -
[JavaScript] 프로그래머스 :: 최소직사각형
최소직사각형 명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다. 아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다. 명함 번호 가로 길이 세로 길이 1 60 50 2 30 70 3 60 30 4 80 40 가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이..
2022.12.10 -
[Node.js] 백준 1260 :: DFS와 BFS
7번의 시도 끝에 성공...😵 DFS와 BFS DFS / BFS가 뭔데,, BFS와 DFS 모두 모든 정점을 방문한다는 것은 동일하지만, 각각 방문하는 경로가 다르다. DFS DFS는 현재 정점과 연결된 정점 중 한 정점에만 방문할 수 있다. 단, 방문할 수 있는 정점들의 모든 경우의 수를 방문해봐야 한다. (1과 연결된 정점이 2, 3이라면 2를 방문하는 경우와 3을 방문하는 경우를 모두 수행해야 한다.) 방문했던 지점을 다시 거치는 것도 가능하다! (방문으로 따지지는 않으므로 결과를 담는 배열에 추가하지는 않는다.) BFS BFS는 현재 정점과 연결된 정점을 동시에 모두 방문할 수 있다. 방문한 정점을 queue에 담아놓고, queue에 담긴 정점들을 앞에서부터 하나씩 꺼내서 해당 정점과 연결된 모든..
2022.11.13 -
[JavaScript] 프로그래머스 :: 여행경로
여행경로 제한사항 모든 공항은 알파벳 대문자 3글자로 이루어집니다. 주어진 공항 수는 3개 이상 10,000개 이하입니다. tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다. 주어진 항공권은 모두 사용해야 합니다. 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다. 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다. 입출력 예 tickets return [["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]] ["ICN", "JFK", "HND", "IAD"] [["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","S..
2022.11.12 -
[JavaScript] 프로그래머스 :: 타겟넘버
타겟 넘버 문제 설명 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요. 제한사항 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. 각 숫자는 1 이상 50 이하인 자연수입니다. 타겟 넘버는 1 ..
2022.11.12 -
[Node.js] 백준 1012 :: 유기농 배추
유기농 배추 드디어 dfs 문제를 푸는 데 성공했다 😘 // 입력값 const fs = require("fs"); const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n"); // 각 테스트 케이스의 배추밭 배열 const arr = []; // 각 테스트 케이스의 x, y 길이 const testCaseInfo = []; // 결과 const result = []; // 테스트 케이스의 x, y, k가 담긴 index let infoIndex = 1; for (let caseIndex = 0; caseIndex < Number(input[0]); caseIndex++) { let x = Number(input[infoIndex]...
2022.11.06