본문 바로가기

나는 오늘,

(371)
[Python] 리스트 안에 중복된 원소의 개수 구하기 import collections a = [1,1,1,1,2,2,2,2,3,3,4,5,5] counter=collections.Counter(a) print(counter) # Counter({1: 4, 2: 4, 3: 2, 5: 2, 4: 1}) print(counter.values()) # [4, 4, 2, 1, 2] print(counter.keys()) # [1, 2, 3, 4, 5] print(counter.most_common(3)) # [(1, 4), (2, 4), (3, 2)] dict = [] for key, value in counter.items(): dict[key] = value
[Programmers] 스킬트리 *스킬에 있는 문자의 순서를 인덱스화했다. indegree[26]은 스킬의 문자의 위치를 저장한다. 스킬이 "CBD"라면 0 2 1 3 0 0 0 0 0 0 이렇게 저장이 되어있다. *스킬트리에 있는 문자 중 스킬에 속한 문자들은 각 indegree[] 에 저장된 숫자로 치환한다. *숫자가 1씩만 증가하는 순서로 되어있어야 하기 때문에 idx 변수에 값을 저장해서 1씩 증가하는지 확인한다. #include #include #include #include #define INF 987654321 using namespace std; int indegree[26] = {0}; int solution(string skill, vector tree) { int answer = 0; for (int i = 0; i..
[자료구조] 삽입정렬(Insertion Sort) 구현하기 #include #include //삽입정렬 using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int arr[10]; for (int i = 0; i = 0 && arr[j] > pivot) { arr[j+1] = arr[j]; j--; } arr[j+1] = pivot; } for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } return..
[BOJ] 18808. 스티커 붙이기 *단순 시뮬레이션 *스티커가 회전한 결과를 미리 저장한다. sticker[100][4][10][10] 0: 0도 1: 90도 2: 180도 3:270도 *스티커가 순서대로가 아니라 조합을 구하는 건 줄 알고 시간초과를 걱정했는데 다행히 순서대로 붙이는 것이다. 스티커를 순서대로 불러오면서 4방향을 모두 본다. check() 에서는 지금 범위에 스티커를 붙일 수 있는지 없는지를 확인하고, 붙일 수 있으면 넣는다. 여러 곳을 붙일 수 있으면 가장 위쪽을 선택하는 것이기 때문에 그리디하게 해결할 수 있다. *스티커의 높이와 너비는 차지하는 칸과 동일하지 않기 때문에 sizes라는 백터배열에 저장한 후 가져왔다. *코드가 많이 더럽다. 시뮬레이션 문제이니, 풀이 방법만 참고하시길.. 더보기 #include #i..
[BOJ] 18809. Gaaaaaaaaaarden * 배양액들의 조합을 구해서 배치한다. * 큐를 [초록색 배양액, 빨간색 배양액] 으로 두 개를 사용하는데 depth와 좌표 정보를 넣었다. depth는 처음에 문제를 잘 못 이해해서 예시를 보고 추가했다. G 1 or 2 R 이렇게 되어있을 때만 가운데 좌표에 꽃이 필 수 있다. 동시에 도달했을 때의 정보를 넣어줘야 하는데 그 정보를 depth로 기록했다. *depth를 기록했다면 이 정보를 빠르게 찾아내야 하는데, 이 정보는 dp[][] 배열에 기록해서 빨간색 배양액이 다음에 갈 곳에 이미 초록색 배양액이 있다. -> dp[nx][ny] 가 depth + 1 이면 초록색 배양액이 방금 전에 도달한 곳이다라는 정보를 찾아낼 수 있다. -> 꽃을 틔운다. *50*50 인데 조합까지 해서 그런지 시간이 꽤..
[자료구조] qsort, quick sort 구현하기 *stdlib.h에 있는 qsort는 compare 함수만 구현하면 손쉽게 사용할 수 있다. compare에 넘기는 void* 포인터는 상수 포인터이므로 변경이 불가능하다. [qsort] #include #include int compare(const void *a, const void *b) { int n1 = *(int *)a; int n2 = *(int *)b; // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴 if (n1 < n2) return -1; else if (n1 == n2) return 0; else return 1; } int main() { int num[10]; for (int i = 0; i
[BOJ] 10799. 쇠막대기 (C) *스택 자료구조 구현 연습을 위해 C로 풀이 *() 는 레이저이므로 레이저가 나올 때마다 스택에 있는 [(] 의 개수만큼 더해준다. (쇠막대기가 잘라지니까) *[(]는 스택에 푸시 (레이저는 푸시 안함) *[)]는 스택에서 팝하는데 이때, sum++ 을 해줘야 한다. ((()())) 이렇게 있다면 보기 편하게 레이저를 *로 치환한다. ( (* *) ) 이렇게 될 것이다. 그럼 막대는 ( (* *) ) --- -> - - - ------ -> -- -- -- 이렇게 되는 데 레이저를 만날 때마다 스택에 있는 개수만큼 막대의 개수가 증가하게 된다. 막대의 끝을 의미하는 [)]가 나올 때는 나누어진 막대의 가장 오른쪽 개수를 세야 하기 때문에 sum++을 해준다. #include #include #includ..
10진수 -> 16진수/ 16진수 -> 10진수 C언어로 구현하기 *16진수 -> 16으로 나눈 값의 나머지로 아스키코드값과 대응 *8진수 -> 8로 나눈 값의 나머지로 아스키코드값과 대응 #include #include int main() { int n; scanf("%d", &n); char hexa[20] = {0,}; int pos = 0; while(n > 0) { int mod = n % 16; if (mod = 0; --i) { printf("%c", hexa[i]); } printf("\n"); } #include #inc..