ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [시뮬레이션] 5658 :: 보물상자 비밀번호
    ALGORITHM/SWEXPERT|SOFTEER 2018. 10. 3. 12:34

    5658 :: 보물상자 비밀번호


    https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo&



    1) 풀이 

    첫 번째 테이스 케이스를 기준으로 생각했다. 그림부터 설명까지 너무 친절.....



    주어진 조건(N은 4의 배수이고, 8이상 28이하의 정수이다. (8 ≤ N ≤ 28)) 과 그림, 그리고 회전한 후에 출력 값을 파악하면 이 문제는 다 푼 것 같다. N은 4의 배수이고, 변의 갯수는 총 4부분. 그러므로 회전 후 다시 자기 자신으로 돌아올 수 있는 회전 값은 N/4 값이 된다.  다른 사람은 어떻게 풀었는지 아직 못 봤지만 나는 약간의 노가다(?)를 했다. input을 받을 수 있는 arr 라는 array를 하나 만들고, 회전할 때마다 값을 저장하고 이동시킬 수 있는 cp라는 array를 만들었다. 그 후 arr[N-1]값을 cp[0] 값에 넣고 나머지 arr에 있는 값들을 다시 cp[1]...cp[N-2]값에 넣은 후 cp값을 통채로 arr에 복사해넣고 store(N/4)라는 함수를 불러오는 방식을 썼다. 


    store 함수에서는 N/4 즉, rotate할 함수를 매개변수로 받아서 이용했다. rotate를 하면서 나오는 모든 값들을 벡터에 저장하는 방법을 사용했다. 원래는 store함수에서 vector에 push하면서 동시에 중복제거를 하려고 했는데 왜 인지 모르겠지만, segmentation fault가 나오는 바람에 그냥 main함수에서 sort와 함께 중복제거를 하였다.


    2) Vector 

    std::vector 없이 문제 푸는 것은 상상이 안간다. 필수템!! sort함수야 워낙 많이 쓰고 유용하니깐 다른 설명은 필요 없을 것 같다.

    sort(v.begin(), v.end(), cmp); //cmp는 새로운 함수를 만들어서 내림차순으로 만들었다.

    중복제거를 위해 find()를 쓰려고 했는데 왜 때문인지 적용이 안되서 unique()를 썼는데 나쁘지 않다. 중복되는 수를 제일 끝에 쓰레기 값으로(?) 저장하기 때문에 앞에서부터 count하는 이런 문제에서는 유용한 것 같다. 포인트는 sort를 한 후에 unique를 써야한다는 것 정도?

    unique(v.begin(), v.end());


    3) 초기화를 생활화하자

    첫번째 테스트 케이스를 기준으로 503이 나오고 나서 전체 테스트를 돌렸더니 2~5번까지 다 달랐다....! 순간 당황해서 커피 한 잔 시키고 왔다;; 벡터의 모든 값을 출력해보니깐 아, vector 초기화 안 했구나 라는 생각이 바로 들었다... arr랑 cp는 memset 해놓고 vector는 왜 때문에.....

    fill(v.begin(), v.end(), 0);

    으로 깔끔하게 모든 테스트 케이스를 통과했다.


    4) 16진수를 10진수로 변환

    왜 때문인지 이건 처음 해본 것 같다. 구글링의 결과 간단하게 해결. c_str()을 한 이유는 vector의 타입을 string으로 해서 char 형태로 바꿔주느라 그런 것이다.

    (int)strtol(v[K-1].c_str(), NULL, 16)

     

    5) 총평

    문제 파악부터 테스트 통과까지 한 한시간 정도 걸린 것 같다. 사실 완벽하게 어떻게 풀어야할지 제대로 안 짜서 중간중간 아 이것도 넣어야 하네 했던 부분이 몇 개 있어서 좀 시간이 걸린 것 같다. 제대로 짠 후에 코드 쓰는 것을 습관화 해야할 것 같다. 


    'ALGORITHM > SWEXPERT|SOFTEER' 카테고리의 다른 글

    [Softeer] 장애물 인식 프로그램 (lv.2)  (0) 2021.11.02
    [Softeer] 8단 변속기 (lv.2)  (0) 2021.11.02
    [Softeer] 바이러스 (lv.2)  (0) 2021.11.02
    [Softeer] 성적 평균 (lv.3)  (0) 2021.11.02
    [BFS] 1953::탈주범 검거  (0) 2018.10.02

    댓글

Programming Diary