복기

 

그동안 나태한 나날을 보내다 오랜만에 푼 탓도 있겠지만 정말 시간을 많이 잡아먹은 문제입니다. (시간을 재진 않았지만 세 시간은 넘어간 것 같네요.)

또, 문제 푸는 방법을 다시 한 번 깨닫게 해 준 문제이기도 하죠.

 

  * 문제 푸는 방법
  1번 문제를 읽는다
  2번 문제를 이해한다.
  3번 문제를 푼다.

 

정말... 알지만 실천하기 힘든 것 같습니다. ㅠㅠ 문제를 읽기도 전에 이미 손은 자판을 치고 있고 이해는 대충한 상태로 코드를 짜다가 이상하다 싶을 때가 되서야 문제를 다시보게 되는... 항상 고쳐야하지 하고 다짐하지만 마음이 급한 탓인지, 성격이 급한 탓인지 쉽지가 않네요. 정직하게 가는 길이 지름길인 것을... -_-; 이번에도 T번의 입력만큼 회전을 모두 시키고 나서 원판의 인접한 수를 찾는 거라고 이해하고 코드를 짜다가 싸한 느낌에 문제를 다시 읽어보니 T번의 매 입력마다 원판 회전 후 인접한 수를 찾아야 하는거였죠.

 

흠... 글을 쓰기 전에는 문제 잘못읽어서 시간을 많이 날린줄 알았는데 쓰면서 다시 생각해보니 굳은 머리와 구현 능력이 부족함에도 좀 더 이쁘게 코드를 짜려했던 제 욕심이 범인이었네요.

 

우선 원판을 k번 회전시키는 부분에서부터 막혔는데 처음에 생각했던건 1번 숫자를 먼저 저장해놓고 M-1번 만큼 다음에 이번 자리에 올 숫자의 인덱스를 찾은 뒤 이동시키고 마지막엔 남는 자리에 저장해 두었던 1번 숫자를 넣어주려고 했었죠. 예를 들어, M이 5이고 원판 하나의 숫자가 { 1, 7, 3, 9, 5 } 일때, 반시계방향으로 2회 회전시켜야한다면 저장한 1번 인덱스에 올 인덱스는 3번이고 그다음은 5 < 2 < 4 그리고 M번째 마지막 4에는 저장해두었던 < 1 을 넣는것이죠.

네. 하지만 간과한 부분이 있었으니 경우에 따라 모든 숫자에 회전의 기회가 돌아가지 않을 수가 있었습니다. { 1, 2, 3, 4 } 에 CCW로 2회라면 1 < 3 < 1 < 3 < ... 이렇게 돌게 되는거죠. 결국 저대로라면 M과 k에 따라 숫자를 2개, 3개, 저장해야하는 꼴이니... 결국은 가장 쉽게 생각되는 배열 복붙으로 풀었습니다. 크기도 크지 않은데 배열을 하나 더 만들려니 왜이리 마음이 안좋은지 ㅠ.

회전시 시작 위치에(1번) 들어갈 인덱스가 3번이라면 3번부터 배열 한바퀴 돌리면서 복사한 후 나중에 그대로 붙혀넣기했습니다.

 

#pragma warning(disable : 4996)
#include <stdio.h>

int N, M, T;
int in[55][55];

void erase(int n, int m, int c) {
    if (in[n][m] != c) return;
    in[n][m] = 0;
    erase(n + 1, m, c);
    erase(n - 1, m, c);
    erase(n, (m - 1) ? m - 1 : M, c);
    erase(n, (m + 1) % (M + 1) ? m + 1 : 1, c);
}
int main(void) {
    scanf("%d %d %d", &N, &M, &T);
    for (int n = 1; n <= N; n++)
        for (int m = 1; m <= M; m++)
            scanf("%d", &in[n][m]);
    for (int t = 0; t < T; t++) {
        int x, d, k;
        scanf("%d %d %d", &x, &d, &k);
        k = d ? k : M - k;

	// 원판 회전시키기
        int cp[55] = {};
        for (int n = x; n <= N; n += x) {
            for (int m = 1; m <= M; m++)
                cp[m] = in[n][(k + m - 1) % M + 1];
            for (int m = 1; m <= M; m++)
                in[n][m] = cp[m];
        }

	// 회전 후 붙어있는 수 삭제
        int del = 0;
        for (int n = 1; n <= N; n++) {
            for (int m = 1; m <= M; m++) {
                if (in[n][m] == 0) continue;
                if (in[n][m] != in[n + 1][m] &&
                    in[n][m] != in[n - 1][m] &&
                    in[n][m] != in[n][(m - 1) ? m - 1 : M] &&
                    in[n][m] != in[n][(m + 1) % (M + 1) ? m + 1 : 1]) continue;
                del++;
                erase(n, m, in[n][m]);
            }
        }
        if (del) continue;

	// 평균내서 더하기 빼기하는 작업
        double avr = 0;
        int cnt = 0;
        for (int n = 1; n <= N; n++) {
            for (int m = 1; m <= M; m++) {
                avr += in[n][m];
                if (in[n][m]) cnt++;
            }
        }
        if (cnt != 0)
            avr /= cnt;
        for (int n = 1; n <= N; n++) {
            for (int m = 1; m <= M; m++) {
                if (in[n][m] == 0) continue;
                if (in[n][m] < avr) in[n][m]++;
                else if (in[n][m] > avr) in[n][m]--;
            }
        }
    }
    
    // 답구하기 총합
    int ans = 0;
    for (int n = 1; n <= N; n++)
        for (int m = 1; m <= M; m++)
            ans += in[n][m];
    printf("%d\n", ans);
    return 0;
}

더욱 정진해야겠습니다. :-)

'개발 > c' 카테고리의 다른 글

[백준] 16236 아기 상어  (0) 2020.04.28
[백준] 17825 주사위 윷놀이  (0) 2020.04.24
[백준] 3111 검열  (0) 2019.03.05
[백준] 4179 불!  (0) 2018.12.13
winpcap pcap_pkthdr 구조체에서 caplen과 len의 차이  (0) 2018.12.01

일전에 동생이 쓰고있는 노트북이 안좋다며 투덜거린적이 있었죠. 80만원 정도선에서 데스크탑으로 사준다 했더니 후진거 안산다며 됐다던 녀석이었습니다만 ㅋㅋ.. 이번에 구입한 제 컴퓨터가 좋아보였던걸까요? 자기것도 맞춰달랍니다 ㅋ

 

제 컴퓨터와 비슷한 사양으로 샀는데 그사이 가격이 좀 내렸더군요 ㅠㅠ 항상 안사면 오르고 사고나면 내리는 법이죠.

 

구매 내역

 

가격이 내린 덕분에 이번엔 CPU 쿨러를("잘만 CNPS9X OPTIMA WHITE LED") 구매했는데도 가격은 저번보다 2만원가량 낮습니다.

 

이번에도 케이스는 3RSYS의 L530 입니다. 이번엔 화이트 색상인데 이유는 모르겠지만 화이트가 블랙보다 좀 더 비싸네요. 그래픽카드도 하얀색이 검은색보다 비싸던데 하얀색 찾으시는 분들이 많은가 봅니다. (저는 검은색을 선호하지만)

 

기본 CPU 쿨러와 다르게 잘만 쿨러는 메인보드에 부착된 기본 브라켓?을 사용합니다. 걸쇠를 걸고 나사를 조여 고정하는 방식이죠. 고정하고 나서 펜을 다는데 좀 어려움이 있었는데요. 아래 그림을 보면 펜을 걸수있도록 홈이 여기저기 많이 있습니다. 저는 펜에 고무 댐퍼를 부착해서 2번 위치에 펜을 걸었는데요. 인터넷에 글 찾아보면 보통은 고무 댐퍼 안붙히고 1번 위치에 많이들 거시는 것 같더라고요.

저번엔 인생 첫 컴퓨터 조립이었다보니 선정리가 좀 엉망이었는데 이번엔 똑같은 케이스로 두 번째 조립인데다 유튜브에서 좋은 동영상을 찾아서 보면서 하다보니 뒷면의 선이 전보다 많이 깔끔해졌습니다. 왠지 앞면이 조금 지저분해보이는 것 같지만요 ㅋㅋ. 조립하고 보니 하얀색도 멋있네요. 점점 컴퓨터 조립이 재미있어 지는 것 같습니다.

'OLD > 생활' 카테고리의 다른 글

중소기업청년전세대출 후기  (0) 2020.05.19
고시원 생활 후기  (3) 2020.05.06
혀 깨물어서 병원간 후기  (0) 2020.04.29
지방종 제거 수술 후기  (2) 2020.04.07
[구매 후기] 80만원대 데스크탑 컴퓨터  (0) 2020.03.27

2020년 03월 21일 지방종 제거 수술.

 

어느날 밤 샤워를 하다가 왼쪽 팔 접히는 부위에 혹을 발견했습니다. ㄷㄷ

검색해보니 지방종, 육종, 악성 종양, 양성 종양 등등 말이 많습니다.

 

정확한 확인을 위해 동네 병원에 방문했습니다.

의왕역 앞에있는 송재국 정형외과입니다.

 

엑스레이를 찍고 뼈엔 이상이 없는 걸 확인한 후 초음파 검사를 했습니다. 일단 지방종으로 보인다고 합니다. 제거를 해도되고 당장은 두고봐도 된다고 했지만 지방종이 생겼다는걸 알게되니 이상하게 계속 신경이 쓰여서 그냥 제거하기로 했습니다.

 

먼저는 마취를 합니다. 마취는 환부 주변, 사방으로 조금씩 4, 5번 정도 한 것 같습니다. 그리고 째는데 이 때 통증이 있으면 있다고 말합니다. 마취를 다시 해줍니다. 수술 시간은 1시 36분 ~ 2시 15분으로 대략 40분 정도 걸렸습니다. 수술 후 대략 2주 동안은 수술 부위에 물이 닿으면 안된다고 알려줍니다. 소독후 방수 밴드를 붙히고 마지막으로 붕대를 감아줍니다.

보다 확실하게 알기 위해 때어낸 조직으로 조직 검사를 한다고 합니다. 검사 결과 운동을 해서 생긴 염증 조직이라는데 운동했다고 이런게 생기는줄은 처음 알았네요... 이후론 이틀에 한 번정도 방문해서 소독하고 밴드와 붕대를 갈게 됩니다. 2주후 실밥을 제거합니다.

금액은 총 167,000 원이 나왔습니다. 저의 경우 소독을 두 번하고 또 오란 얘기가 없어서 안 갔는데 이틀마다 한 번씩 가는게 맞는 것 같습니다. 실밥빼러 갔더니 왜이리 안왔냐며 바빴냐고 물어보시더라고요. 다 갔다고 치면 대충 20만원 안되게 나왔겠네요. 이상 후기를 마칩니다. 다른 지방종 증상을 보이시는 분께 도움이 되었으면 좋겠네요. 가장 중요한건 인터넷 찾아보는 것 보다 병원에 빨리 가는 것 같습니다. 의사 진찰이 더 정확하니까요. 우리 모두 건강합시다~!

회사 사정상 갑작스럽게 안드로이드 를 하게됐습니다.

자바도 해본적이 없는데 안드로이드라니... 당황스럽지만 앞으론 안드로이드 공부를 해야합니다.

 

먼저 개발 환경을 찾아보니 대부분 안드로이드 스튜디오를 사용하는 것 같습니다.

다행히 설치는 공식 홈페이지에서 친절하게도 한글로 가이드되고 있습니다.

* 사이트 : https://developer.android.com/studio/install?hl=ko

 

Android 스튜디오 설치  |  Android 개발자  |  Android Developers

Windows, macOS 또는 Linux에서 Android 스튜디오를 설정 및 설치합니다.

developer.android.com

새로 시작하는 마음으로 빈 프로젝트를 만들었습니다.

아래에는 빈 프로젝트 생성 후 빌드하면서 겪었던 두 가지 문제에 대해서 적었습니다.

 

 

1. No target device found.

 

가상 디바이스를 설정하지 않아 발생한 에러입니다. 자세히 살펴보면 우상단에 No Device 라고 적힌 부분이 보입니다.

    "Open AVD Manager - Create Virtual Device - New Hardware Profile"

 

가지고 있는 핸드폰 공기계 사양과 비슷하게 하드웨어 프로파일을 만들었습니다.

이제 생성한 디바이스가 보입니다.

 

2. Error while waiting for device: Could not start AVD

참고

 

참고 링크 확인시 아래 내용을 확인할 수 있습니다.

> 가상화 확장 프로그램 요구사항

개발 환경 요구사항 외에도 컴퓨터 프로세서는 다음 가상화 확장 프로그램 기술 중 하나를 지원해야 합니다.

- Intel 가상화 기술(VT, VT-x, vmx) 확장 프로그램
- AMD 가상화(AMD-V, SVM) 확장 프로그램

순간 내 컴퓨터가 가상화 확장프로그램을 지원하지 않는 컴퓨터면 어떻하지 하는 걱정이 들었지만 다행히 최신 프로세서는 대부분 가상화 확장 프로그램을 지원한다고 합니다.

 

번거롭지만 컴퓨터를 재부팅하고 BIOS 메뉴에 들어가야합니다.

저의 경우 AMD사의 CPU를 사용합니다. 아래 경로에서 SVM을 켤 수 있었습니다.

    "오버 클럭 셋팅 메뉴" - "그외 CPU 셋팅" - "SVM Mode"

 

그리고, Intel의 "HAXM"대신 "Hyper-V"를 사용 합니다. 경로는

    "제어판" - "프로그램 및 기능" - "Window 기능 켜기/끄기" - "Hyper-V"

입니다.

이렇게 설정을 모두 마치면

빈프로젝트 실행시

"Hello World!"

문구를 확인할 수 있습니다. ㅎㅎ

'개발 > android' 카테고리의 다른 글

가로, 세로 Tab 만들기 예제  (0) 2020.06.04

2021년 11월 ~

    * SPU

2020년 04월 ~ 2021년 10월 (19개월)

    * 안드로이드를(java) 이용한 앱 유지보수

2019년 06월 ~ 2020년 03월 (10개월)

    * Qt QML을 이용한 앱 유지보수 및 개발

        * USBMusic 선행 개발 보조

        * VideoManual 유지 보수

2018년 07월 ~ 2019년 05월 (11개월)

    * MFC를 이용한 앱 유지보수 및 개발

        * 컨버터 앱(H.264 패킷 파일 → mp4 파일) 개발

        * 카메라 펌웨어 업데이트 앱 개발

        * FrameGrabber 유지보수

'OLD > 기록' 카테고리의 다른 글

유용한 링크 모음  (0) 2018.11.30
도미니언 기록지 1  (0) 2018.11.25

+ Recent posts