# permutation

[Python] 순열, 조합
Permutation 순열 : 순서가 있을 땐 combinations 사용 Combination 조합 : 순서가 없을 땐 combinations 사용 중복순열, 중복조합에 관한 모듈도 있는데, 그건 아직 필요한적이 없었다. product, combinationswithreplacement 이 두개인데, 나중에 사용하는 떄가 온다면 그 때 작성해도 될 것 같다.

Recursive, Permutation, Combination
1. Recursive Function 재귀 함수란 정의 단계에서 자신을 재참조 하는 함수를 의미. 주로 문제를 작은 부분으로 나누어서 풀 때 활용한다. 대표적인 예시로 펙토리얼과 피보나치 수열이 존재한다. 재귀함수를 사용하는 경우 반드시 종료조건을 달아 주어야 하며, 사이클이 존재하는 경우 사용해서는 안된다. 또한 반복문으로 가능한 경우, 반복문이 함수 호출에 대한 cost를 save할 수 있어서 유리하다. 2. Permutation 서로 다른 n개의 원소에서 r개를 중복없이 순서에 상관있게 선택하는 혹은 나열하는 것을 순열이라고 한다. 순열의 식은 아래와 같다. 2.1. next_permutation() next_permutation(
BOJ 15649 N과 M (1)
[HackerRank] Bigger is Greater
최근 해커랭크와 리트코드 문제들을 접해서 풀어보고 있는데 백준이나 프로그래머스랑은 다른 느낌이라 신기하다. 문제 https://www.hackerrank.com/challenges/bigger-is-greater/problem 접근 방식 주어진 입력 스트링 뒤에서부터 앞으로 가면서, 기존 스트링 집합(prev)보다 작은 글자가 나오면 거기를 기준으로 더 큰 문자를 그 위치로, 그리고 나머지 글자들을 정렬해서 뒤에 덧붙였다. 코드 + your submission contains non ascii characters, we dont accept submissions with non ascii characters for this challenge. 알고보니 주석에 한글이 포함되서 났다 참고참고,,^^,,

시간 복잡도 / Algorithm
Time Complexity 입력값에 따라 알고리즘의 시간 복잡도가 어떻게 변화하는지를 나타냄 Big-O : 최악의 경우 Big-Ω : 평균의 경우 Big-θ : 최선의 경우 1. O(1)- 상수 시간 복잡도 : 입력 크기와 관계없이 실행 시간이 일정하게 유지 ex) 배열 탐색 2. O(log n) - 로그 시간 복잡도 : 반복문을 실행될 때마다 탐색할 양이 반으로 줄어드는 경우 3. O(n) - 선형 시간 복잡도 : 입력값이 증가함에 따라 시간 또한 같은 비율로 증가 4. O(n^2) - 이차 시간 복잡도 : 입력값이 증가함에 따라 시간이 n의 제곱수의 비율로 증가 5. O(nlogn) - 로그 선형 시간 복잡도 : 입력값이
순열과 조합
permutation(순열) 순서를 고려한 경우의 수 두 번째 인자 생략 가능 [('1', '2', '3'), ('1', '3', '2'), ('2', '1', '3'), ('2', '3', '1'), ('3', '1', '2'), ('3', '2', '1')] [('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')] combination(조합) 순서를 고려하지 않은 경우의 수 두 번째 인자 생략 불가능 [('1', '2', '3')] [('1', '2'), ('1', '3'), ('2', '3')]

[알고리즘] 순열 (Permutation)
순열 (Permutation)이란? n개의 값 중에서 r개의 숫자를 모든 순서대로 뽑는 경우를 말한다. 예를 들어, [1, 2, 3] 이라는 3개의 배열에서 2개의 숫자를 뽑는 경우는 이렇게 6개이다. 1. Swap을 이용한 순열 첫 번째는 swap 함수를 만들어서 배열들의 값을 직접 바꾸는 방법이다. 배열의 첫 값부터 순서대로 하나씩 바꾸며 모든 값을 한 번씩 swap 한다. depth를 기준 인덱스로 하여 depth보다 인덱스가 작은 값들은 그대로 고정하고 depth보다 인덱스가 큰 값들만 가지고 다시 swap을 진행한다. https://github.com/ParkJiwoon/Algorithm/blob/master/Algorithm/image/perm_1.png

⬛[프로그래머스] 외벽 점검
🧡문제 설명 레스토랑을 운영하고 있는 "스카피"는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로 했습니다. 레스토랑이 있는 곳은 스노우타운으로 매우 추운 지역이어서 내부 공사를 하는 도중에 주기적으로 외벽의 상태를 점검해야 할 필요가 있습니다. 레스토랑의 구조는 완전히 동그란 모양이고 외벽의 총 둘레는 n미터이며, 외벽의 몇몇 지점은 추위가 심할 경우 손상될 수도 있는 취약한 지점들이 있습니다. 따라서 내부 공사 도중에도 외벽의 취약 지점들이 손상되지 않았는 지, 주기적으로 친구들을 보내서 점검을 하기로 했습니다. 다만, 빠른 공사 진행을 위해 점검 시간을 1시간으로 제한했습니다. 친구들이 1시간 동안 이동할 수 있는 거리는 제각각이기 때문에, 최소한
[Algorithm] Permutation & Combination(순열 & 조합) Algorithm
🎯 목표 : 순열과 조합 알고리즘의 이해와 구현 📒 Permutation Algorithm(순열 알고리즘) 📌 순열 순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산 n개의 요소의 순서를 뒤섞는 경우의 수는 n! 과 같다(5! = 1x2x3x4x5) 모든 경우의 수를 계산해야하는 완전 탐색 알고리즘이다. {a,b,c}와 {a,c,b}는 다른 값이다. 순열과 중복 순열의 차이는 자기자신을 포함 하는지에 따라 다르다. 중복순열은 {a,a,b} {a,b,b}와 같이 같은 요소를 허용한다. 서로 다른 n개중에 r개를 선택하는 경우의 수 a 📌 순열의 모든 경우의 수 구현 {A,B,C,D,E} 의

알고리즘 - 순열과 조합
순열과 조합 순열과 조합은 쉽게 수학 공부를 하다보면 확률과 통계에서 접할 수 있는 개념이다. Permutation과 Combination으로 말이다. 예전에 python을 할 때에는 python package에서 순열과 조합을 제공해줬던 것으로 기억한다. 따라서 별 어려움 없이 이를 활용할 수 있었지만, kotlin에서는 그렇지 않다. 그렇기에 kotlin에서 순열과 조합을 구현하는 방법을 알아보자. 조합 조합은 Combination으로 n개의 item 중 k개를 뽑는 방법을 의미한다. 이를 구현하면 아래와 같다. 아래 코드의 기준은 item이 Int일 때의 예시이다. 여러 방식이 있을 수 있겠지만 나는 이 방식을 사용한다. 우선 재귀적으로 불릴 helper function을 이용한다. hel
Josephus Survivor
살면서 처음보는... 요세푸스 순열, 요세푸스 문제라는 건데. 요세푸스문제 생각보다 이해가 너무 안돼서 3일은 생각한것같다... 일단 푸는방법은 >* Queue를 이용하는 방법 Circular Linked List를 이용하는 방법 Recurrence Relation(점화식)을 이용하는 방법 내가 푼 방법은 꽤 어려웠던 문제인만큼.. 혼자 풀지 못했다. 그중에서 도움됐던 영상을 공유하자면 주니온TV 아무거나연구소 다. 엄청 쉽게 설명 해주고 , 이해가 안가더라도
BOJ - 19942 - 다이어트
BOJ - 19942 - 다이어트 문제 19942번: 다이어트 문제 식재료 N개 중에서 몇 개를 선택해서 이들의 영양분(단백질, 탄수화물, 지방, 비타민)이 일정 이상이 되어야 한다. 아래 표에 제시된 6가지의 식재료 중에서 몇 개를 선택해서 이들의 영양분의 각각 합이 최소 100, 70, 90, 10가 되도록 하는 경우를 생각해보자. 이 경우 모든 재료를 선택하면 쉽게 해결되지만, 우리는 조건을 만족시키면서도 비용이 최소가 되는 선택을 하려고 한다. | 재료 | 단백질 | 지방 | 탄수화물 | 비타민 | 가격 | | --- | --- | --- | --- | --- | --- | | 1 | 30 | 55 | 10 | 8 | 100 | | 2 | 60 | 10 | 10 | 2 | 70 | | 3 | 10 | 80 | 50 | 0 | 50 | | 4 | 40 | 30 | 30 | 8
C++ 비트 마스킹
C++ 비트 마스킹 개yo 이번 포스팅에선 기본적인 비트 연산을 알아보고 직접 구현해 보고, 이를 이용한 조합Combination을 함께 알아보도록 하겠다. 비트 연산 먼저 비트연산에 대하여 알아 보도록 하겠다. 우선 왼쪽 시프트 연산자 int a = 8 → 0110 > 예를 들어 (1 << 2)는 2의 2승, (1 << 0)은 2의 0승을 상징한다. | idx번째 비트끄기 | S &= ~(1 << idx) | | --- | --- | | idx번째에 대한 XOR 연산(0은 1로, 1은 0으로) | S ^= (1 << idx) | | 최하위 켜져있는 idx 찾기 | idx = (S & -S) | | n인 집합의 모든 비트를 켜기 | (1 << n) - 1 | | idx번째 비트를 켜기 | S |= (1 << idx) |
순열 구하기
분류: Permutation 문제 정수 배열이 주어졌을 때, 해당 배열의 순열을 구해서 반환하라 풀이 재귀로 푸는 방식이 있고, 그냥 loop를 돌면서 푸는 방식(Heap method)이 있다. javascript 특성 상 재귀보단 loop를 돌면서 구하는게 맞을거 같다라는 생각이 들었다. 다만 Heap method로 풀 경우 결과 값이 조금 달라지는데 이에 따라 정렬이 필요할 수 있을거 같단 생각이 들었다. 1. Recursion 비교적 깔끔하게 순열을 구하는 로직이 작성된 것을 볼 수 있다. 2. Heap method Reference https://stackoverflow.com/questions/9960908/permutations-in-javascript

수식 최대화
문제 [문제] https://school.programmers.co.kr/learn/courses/30/lessons/67257 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다. 해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(+, -, *) 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다. 단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, + > - > * 또는 - > * > + 등과 같이 연산자 우선순위를 정의할 수 있으나 +,* > - 또는 * > +,-처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의
pytorch snippet
torch.max 2022-11-23 torch.perm dataloader ref [stackoverflow: numpy array to pytorch] (https://stackoverflow.com/questions/44429199/how-to-load-a-list-of-numpy-arrays-to-pytorch-dataset-loader) Custom dataset time series with different code 각 id 별로 input_width에 맞는 조각 가능 id | time | temp --- | ---| --- 1 | 0 | 25 1 | 1 | 23 1 | 2 | 17 variable batch size https://discuss.pytorch.org/t/variable-size-of-batches-for-training/26971/3
C++ 순열과 조합
C++ 순열과 조합 개요 12명이 서로(2명씩) 인사하면 66가지의 경우에 수가 나오게 된다. 이 경우의 수는 순열과 조합으로 구할 수 있는데 이번 포스팅에선 이 순열과 조합에 대해 알아 보고, 코드로 구현까지 해보도록 하겠다. 순열 > 먼저 순열, permutation이란 순서가 정해진 임의의 집합을 다른 순서로 섞는 연산을 말한다. > > > 즉 예를들어 { 1, 2, 3 } 의 요소가 있을 때 { 1, 3, 2 } 이런식으로 다른 순서로 섞는것을 연산 순열이라 한다. > > 만약 n 개의 집합 중 n개를 고르는 순열의 개수를 구할 때 중복을 허용한다면 n!이 된다. > 위의 예를 들어 보자면 3개의 자연수{ 1, 2, 3 }를 이용해 만들 수 있는 3자리 자연수는 몇개 일까? > > [ 123,132, 213, 231, 312, 321 ] 6개의 순열이 나오게 된다. > > 또 만약 3개의 자연수{ 1,
[Python] 순열(Permutation)
순열(Permutation) 생성 서로 다른 것들 중 몇 개를 뽑아서 한 줄로 나열하는 것 서로 다른 n개 중 r개를 택하는 순열은 아래와 같이 표현 $$ nPr $$ 그리고 nPr은 다음과 같은 식이 성립 $$ nPr = n(n-1)(n-1)…2*1 $$ nPn = n!이라고 표기하며, Factorial이라고 부름 $$ n! = n(n-1)(n-1)…2*1 $$ {1, 2, 3}을 포함하는 모든 순열을 생성하는 함수 재귀 호출을 통한 순열 생성 숫자 1~3로 나타낼 수 있는 모든 순열 출력
Absolute Permutation
사이트: HackerRank 난이도: 미디움 문제 주어진 자연수 상한선까지 일정한 차이(|pos[i] - i| = k)를 만들어주는 사전적으로 최소단위의 순열을 반환하는 문제이다. 1. 나의 풀이 최소 단위의 순열을 구하기 위해서는 먼저 작은 수부터 넣을 필요가 있다. 조건에 맞을 경우 반환할 순열 P에 넣어놓고, 이미 넣어놓은 값은 제외시키기 위해 Set을 이용해 기록하기로 했다. 2. 다른사람의 풀이 바로 풀 수 있었던 문제들은 지금은 생략하고 추후 더 효율적인 문제 풀이법을 찾아보도록 하겠다. (댓글로 알려주시면 정말 감사하겠습니다 ㅠㅠ)

[알고리즘] 완전탐색(Brute-Force Search / Exhaustive Search) 기법
완전 탐색이란? 컴퓨터의 계산 능력을 이용해 가능한 모든 경우의 수를 체크하여 답을 찾는 방법을 의미한다. 예를 들어, 4자리 암호로 구성된 자물쇠가 있다고 생각해보자. 자물쇠의 암호를 전혀 알지 못할때, 시도할 수 있는 가장 확실한 방법은 0000~9999까지 모든 조합을 시도해 보는 것이다. (최대 10000번의 시도로 해결 가능) 하지만 Computer Science에서 문제 해결을 위해 알고리즘을 사용할때는, 기본적으로 2가지 규칙을 적용한다. > 1. 사용된 알고리즘이 적절한가? (문제를 해결할 수 있는가) 효율적으로 동작하는가? 위 2가지 규칙을 생각했을 때, 완전탐색 알고리즘은 1번 규칙에서는 가장 확실한 방법이 될것이다. (가능한 모든 경우를 구해 답을 찾기 때문에, 답을 찾지 못하는 경우가 없으므로) 하지만 2번 규칙 때문에 완전탐색 알고리즘에는 제약이 따른다. 모든 경우의 수를 탐색하기 때문에, 답이 될 수 있는 경우의 수가 너무 많으면 제한된 시간