[SWEA]코드배틀(레벨업코스) : 1.수열합치기

풀이

삼성SW 역량테스트 B형 유형의 문제이다. STL사용금지에 API를 설계하는 유형이다.

연결리스트를 사용했다.

이중 연결리스트 직접 구현해서 사용하려니까 정말 어렵더라.

코드

//#include <iostream>
//using namespace std;
#define MAX_NODE 1000000
 
struct Node
{
    int data;
    Node* prev;
    Node* next;
};
 
Node nodePool[MAX_NODE];
int nodeCnt;
 
struct List
{
    Node* head;
    Node* tail;
    Node* ptr;
 
    void init() {
        head = &nodePool[nodeCnt++];
        tail = head;
        head->next = tail;
        head->prev = head;
        tail->next = tail;
        tail->prev = head;
        ptr = head;
    }
    void add(int d) {
        Node* temp = &nodePool[nodeCnt++];
        temp->data = d;
        ptr->next->prev = temp;
        temp->next = ptr->next;
        ptr->next = temp;
        temp->prev = ptr;
        ptr = temp;
    }
};
 
List list;
 
void init()
{
    nodeCnt = 0;
    list.init();
}
 
void mergenums(int n, int * arr){
    int num = arr[0];
    int idx = 0;
    Node *np = list.head->next;
    //cout << "npdata : "<<np->data << '\n';
    //순회
    //더큰값 위치 반환
    while (1) {
        if (np == list.tail || np->data > num) {
            break;
        }
        //cout << np->data << ' ';
        np = np->next;
        idx++;
    }
    //cout << "idx : " << idx << '\n';
    //cout << np->data << '\n';
 
    //추가
    List newList;
    newList.init();
    for (int i = 0; i < n; i++) {
        newList.add(arr[i]);
    }
    /*
    cout << "newList" << '\n';
    Node * nnp = newList.head->next;
    while (nnp != newList.tail) {
        cout << nnp->data << ' ';
        nnp = nnp->next;
    }
    cout << '\n';
    */
    //갱신
    //np->prev 다음으로 newList의 처음 연결
    //newList의 마지막숫자 다음(next)로 np연결
     
    np->prev->next = newList.head->next;
    newList.head->next->prev = np->prev;
    newList.tail->prev->next = np;
    np->prev = newList.tail->prev;
    /*
    cout << "list : " << '\n';
    nnp = list.head->next;
    while (nnp != list.tail) {
        cout << nnp->data << ' ';
        nnp = nnp->next;
    }
    cout << '\n';
    */
}
 
int findkth(int kth)
{
    if (kth > 0) {
        Node * nnp = list.head;
        while (kth--) {
            nnp = nnp->next;
        }
        return nnp->data;
    }
    else {
        Node * nnp = list.tail;
        while (kth++) {
            nnp = nnp->prev;
        }
        return nnp->data;
    }
    return 0;
}
Written on August 10, 2019