본문 바로가기

Coding/C + algorithm10

프로그래머스 두 큐 합 같게 만들기(투 포인터) 제목에 큐가 들어가서 큐 문제인 줄 알았는데 .. 예전에 잠깐 스치듯이 공부한 슬라이딩 윈도우 옆에 있던 놈이 문득 생각나서 찾아서 풀어봤다...어제까지 끙끙대다가 포기할까 했는데 저 킹받는 점 세개를 도저히 참을 수 없었다. 투 포인터란?1차원 배열이나 리스트에서 특정 조건을 만족하는 부분을 찾거나, 두 요소 간의 관계를 조사하는 데 사용되는 알고리즘 기법이다.슬라이딩 윈도우와 구분되는 점은, 윈도우 사이즈가 필요에 따라 변할 수 있다.그리고 투 포인터는 양 방향으로 이동이 가능하지만 슬라이딩 윈도우는 한 방향으로밖에 이동하지 못한다.이 문제에서 내가 투 포인터를 쓰고자 한 이유는, 두 개의 1차원 배열을 같은 값으로 만들어야 하기에 queue1과 queue2의 시작방향을 두 포인터의 시작지점으로 설정.. 2024. 11. 13.
프로그래머스 택배 상자(스택) 최근 java를 공부하면서 stack, queue, list 등의 개념에 대해 처음 알았는데 마침 누가 봐도 스택을 사용할 것 같은 문제가 보여서 풀어봤다.문제#include #include #include #define MAX_SIZE 1000000//스택생성typedef struct Stack{ int data[MAX_SIZE]; int top;} Stack;//스택초기화void initStack(Stack* stack){ stack->top = -1;} //pushvoid push(Stack* stack, int value){ stack->data[++(stack->top)] = value;}//맨위요소int peek(Stack* stack){ return stack.. 2024. 11. 12.
프로그래머스 금과 은 운반하기(이진 탐색) 망할 프로그래머스 AI가 0~1단계 문제 몇개 좀 풀었다고 3단계 문제를 추천해 줬다..내가 문제를 맞출 확률이 56%나 된다길래 자존심 상해서 정말 .... 힘들게 풀었다.나름 뿌듯?문제짧게 요약하면 신도시를 건설하는 데에 금a, 은b가 들어가는데 기존 도시 i에 있는 자원을 몇 시간동안 옮겨야 하는지 return하면 된다.#include  #include  #include  bool can_transport(long long mid, int a, int b, int g[], int s[], int w[], int t[], size_t t_len) {     long long total_gold = 0, total_silver = 0, total_weight = 0;     for(int i = 0; .. 2024. 10. 28.
프로그래머스 짝수와 홀수(동적 할당, 문자열 리터럴의 특성) 되게 쉬운 문제인데, 동적 할당의 중요성과 문자열 리터럴의 특성을 공부해 볼 수 있었다. 기존 코드sizeof(char)로 1바이트만 할당했음에도 정상작동 되길래 이상함을 느꼈다.answer에 들어갈 값인 "Even" 이나 "Odd"는 4-5바이트가 필요하기 때문이다.(NULL을 고려하면 6) 기존 코드가 동작하는 이유:1. 문자열 리터럴"Even"이나 "Odd"같은 문자열 리터럴은 프로그램이 실행될 때 읽기 전용 메모리에 저장된다. 따라서 위 코드에서 answer는 실제 동적 할당된 메모리가 아닌 읽기 전용 메모리를 가리킨다. 문자열 리터럴을 할당하는 것 자체나 동작엔 문제가 없다. 포인터가 읽기 전용 메모리를 가리키는 것이기 때문에, 코드는 정상적으로 "Even" 또는 "Odd"를 반환하게 된다. 그.. 2024. 10. 23.
프로그래머스 문자열을 정수로 바꾸기('0'의 아스키 코드는 48) 0단계 문제들이 다소 반복적으로 느껴져서 1단계로 넘어왔다1단계에서 가장 쉬운(정답률이 가장 높고, 사람들이 많이 푼) 문제였지만 배운 게 많아 글을 작성하게 되었다.  문제만 보면 단순해 보이고 어떤 함수를 이용해서 한 방에 풀 수 있을 것 같지만 ..  처음 작성했던 코드:1. 아스키코드에서 문자1과 숫자1이 48만큼 차이나는 걸 보고 작성하였다.2. 변수 j는 자릿수 표현을 위해 pow(10, len - 1)을 대입하였다.3. 지금 보니 좀 바보같지만 -1을 곱하면 음수가 되는걸 answer =- answer로 처리했다  개선한 코드:1. 문자에서 '0'을 빼면 숫자가 된다고 한다. 왜냐하면 '0' 의 아스키코드 값은 48이기 때문이다.2. 변수 j를 생성해 자릿수를 표현한 기존과 다르게 이전에 계.. 2024. 10. 23.
프로그래머스 모음 제거(문자열의 끝에는 '\0'을 넣자) 문제 내가 생각한 문제풀이법:1. 반복문을 통해 my_string의 값을 0부터 strlen(my_string)까지 훑으며 모음이 나오면 continue제어문으로 실행 흐름을 변경시킨다.2. printf로 결과를 출력한다 처음에 작성한 코드 문제점:1. malloc으로 할당할 때 int가 아니라 char로 길이에 맞는 메모리를 할당해야 했다.2. answer에 값을 대입해야 하는데 printf로 값을 출력하려 했다.3. 문자열의 끝에 들어갈 '\0'을 고려하지 않았다. 동적 할당을 할 때에도 +1을 해주어야 한다. 개선한 코드:1. 앞서 말한 문제점을 전부 고쳤다.2. 변수 j를 선언해 마지막에 '\0'을 삽입해 문자열의 끝을 맺었다. 동적 할당을 배열 문제에서 두 번 밖에 안 써봐서 할당 길이를 상황에.. 2024. 10. 22.