기본적으로 piechart에는 각 요소에 대한 인덱스들이 화면의 하단에 표시된다. 이 인덱스는 legend 라고 한다.

 

아래의 캡쳐 화면에서는 연도가 인덱스(legend)로 나타나 있다.

 

 

만약 piechart를 룰렛으로 사용하기 위해, legend를 지워야 하는 경우에는 어떻게 해야할까?

 

이런 경우에는 아래의 코드를 이용하여 legend가 표시되지 않게 하면 된다.

 

//(1) piechart의 legend 를 가져온다.
val legend: Legend = pieChart.getLegend()

//(2) 가져온 legend 에 false 값을 준다.
legend.setEnabled(false)

 

다음 이미지는 위 코드를 이용한 결과이다.

 

'android' 카테고리의 다른 글

[android] 도형 그리기 (원)  (0) 2020.08.30
[kotlin][RecyclerView] 가로 정렬  (0) 2020.08.20

히가시노 게이고 (자음과 모음)

 

 

추리소설 작가인 히가시노 게이고의 대표 작품 중 하나이다. 평소에 책을 가볍게 읽거나, 재미있게 보고 싶을 때 추리소설을 선택하곤 했다. 이번에 이 책을 선택한 이유도 그렇다. 그러나 책을 읽어 나갈수록 내용에 대해 한 번 더 생각하게 되었기 때문에 다 읽는데 생각보다 시간이 소모되었다.

 

그 이유는 이 책을 대표하는 키워드인 “사형 제도” 때문이다. 이 시작은 주인공인 나카하라와 사요코의 딸이 강도살인을 당하는 것으로부터 시작된다. 그들은 강도살인의 가해자가 사형을 선고받기를 바랐고, 또 그렇게 하기 위해서 노력한다. 결국, 사형을 받게하는 것은 성공했지만, 나카하라와 사요코는 그토록 원하던 일이 이루어졌음에도 예전의 생활로 돌아가지 못할 뿐만 아니라 마음이 편하지 않았다. 이것을 계기로 그들은 이혼을 하게 된다. 각자의 생활을 이어가던 어느 날, 딸의 사건과 관련해서 알게 된 형사로부터 나카하라는 사요코가 죽었다는 말을 듣게 된다. 살인을 당해 죽은 사요코의 부모님은 예전의 자신의 부부처럼 가해자가 사형을 받기를 원했고, 나카하라는 그것을 돕는다. 그래서 나카하라는 살인이 있던 당일 무슨 일이 있었는지 조사하는데, 그러던 중 사건과 관련된 큰 비밀을 알게 된다.

 

내용을 보면 알 수 있듯이 책은 “사형 제도”와 나아가 “죽음”을 이야기한다. 이 책을 읽으면서 끔찍한 범죄를 저지른 사람을 보면 죽음만이 그 죄를 책임질 수 있다고 생각했던 자신에 대해서 생각하게 되었다. 그러나 가해자가 사형을 받은 뒤에도 마음이 편치 못한 인물들에 대한 이야기를 보면, 과연 죽음이 범죄자가 피해자에게 용서를 구할 수 있는 방법이 될 수 있는가라는 의문이 들었다. 사형을 기다리는 범죄자들은 마음의 속죄가 아니라 그 죽음을 운명으로 받아들인다면 그것은 예상했던 효과가 아니라는 것이다. 이렇게 무거운 주제로 생각을 거듭하도록 했지만 잘 읽혔기 때문에 가독성이 좋고, 읽는 재미도 놓치지 않은 책이다.

 

 

(제목의 '십자가'는 사형을 의미하는 것이 아닐까.)

 

 

책 구입 정보

aladin.kr/p/AbhnB

 

공허한 십자가

<용의자 X의 헌신>, <몽환화>의 작가 히가시노 게이고 장편소설. 출간 즉시 일본 베스트셀러 2위, 일본 독자들의 찬사가 줄 잇는 <공허한 십자가>는 딸을 잃은 주인공 나카하라가 형사로부터 전부.

www.aladin.co.kr

 

'독후감' 카테고리의 다른 글

뉴서울파크 젤리장수 대학살  (0) 2020.09.25

조예은 (안전가옥)

 

 

《뉴서울파크 젤리장수 대학살》은 온라인 서점인 ‘알라딘’에서 카드리뷰를 보고난 뒤 꼭 읽어야겠다고 마음먹게 한 책이다. 다른 책들의 카드리뷰도 자주 보는 편이지만, 특별히 이 책의 것은 그림체와 “놀이공원”, “젤리”라는 키워드가 꼭 읽고 싶게 했다.

 

처음 책을 폈을 때 마음을 확 사로잡는 부분이 있었는데, 바로 이야기와 관련된 일러스트들이었다. 이 부분은 여러 장으로 되어 있어 마치 소설책을 샀는데 일러스트 북도 함께 들어있는 것 같은 기쁨을 주었다. 또한, 미리 내용을 예상할 수 있어 호기심을 자극했다.

 

책의 내용은 다음과 같다. 기대했던 것처럼 이 책은 놀이공원을 배경으로 젤리와 관련된 사건들이 나왔다. ‘뉴서울파크’는 대부분의 놀이공원처럼 밝고, 반짝반짝한 행복이 넘치는 곳이다. 등장하는 인물들은 각자의 고통을 숨긴 체 그 속으로 스며들려고 한다. 이때 어디선가 나타난 수상한 젤리장수. 그는 그들에게 젤리를 나누어준다. 저녁 퍼레이드 시간이 되자, 갑자기 몸이 끈적하게 물질로 녹아버린 모녀로 인해 놀이공원은 혼미백산이 된다. 이 순간부터 미스터리한 젤리와 함께 9명의 주인공들의 이야기가 시작된다.

 

한 권의 책을 집중해서 읽지 못하는 내가 이 책만을 읽을 수 있었던 이유는 전개가 빠르고 그 덕분에 지루할 틈이 없었기 때문이라고 생각한다. 완독을 하고 처음으로 들었던 생각은 ‘책이 참 알차다’라는 것이었다. 아마도 여러 명의 인물이 나오니까 그만큼 사건도 여러 개이기 때문에 전개가 빠를 수 밖에 없었을 것이다.

그리고 책을 읽으면서 왠지 한 클래식 음악이 떠올랐는데, 아쉽게도 음악의 제목은 찾지 못했다. 그 음악의 느낌을 설명해보자면, 겉으로는 웅장하고 화려하지만 어딘가 비극적이다. 비슷한 음악을 소개해보자면, ‘알라딘’에 소개된 이 책의 북트레일러가 있는데 거기서 나오는 노래가 유사하다고 생각한다.

또 다음으로 말할 것은 개인적인 생각이고 다른 소설들도 그러할 수도 있지만, 큰 비중을 차지하는 인물이 아니면 직급명이나 흔히 들어봄직한 이름으로 부른 작가의 의도가 옅보였다. 예를 들어, 뉴서울파크의 인형탈 알바생인 ‘사준’의 이야기에서 나왔던 매니저나 동기는 자주 등장하였음에도 직급명으로 불렸다. 반면에 중요 인물인 ‘유지’나 ‘영두’는 잘 들어본 적 없는 이름이다.

 

마지막으로 이 소설이 마음에 들어서 자연스럽게 소설의 작가에 대해서도 궁금해졌다. 인터넷에 검색을 해본 결과, ‘조예은’이라는 이름을 쳤을 때 나오는 인물과는 관계가 없었다. 그러나 아래의 인터뷰 페이지에서 작가에 대해 알아볼 수 있었다. 독특한 소재를 어색함 없이, 흡입력있게 이야기를 잘 전달해서 인지 당연히 글과 관련된 공부를 했을 것이라고 생각했는데, 생각외로 원래 미술을 전공했다고 한다. (그래서 책 속의 일러스트도 작가의 작품일 것이라고 생각했지만, ‘최지욱’이라는 일러스트레이터의 작품이었다) 인터뷰에서 작가는 “글”을 쓰기보다 “이야기”를 만들고 싶다고 하면서 자신을 표현할 수 있는 것으로 글쓰기를 선택했고, 그렇게 소설을 쓰기 시작했다고 한다. 자신의 세계를 실체화시킨다는 점이 참 멋있다는 생각을 했다.

인터뷰 막바지에서 “만약 뉴서울파크 안에 있었다면, 젤리를 먹었을 것 인가?” 라는 질문에작가는 100% 먹었을 것이라고 답했다. 이것을 보고 나였다면 아마 하나 정도는 먹어보았을 것같다.

 

 

 

※ 작가의 인터뷰 --> 스포일러가 될 수 있으므로, 다 읽은 뒤 보는 것을 추천한다.

 

https://m.post.naver.com/viewer/postView.nhn?volumeNo=23870904&memberNo=43688391&vType=VERTICAL

 

《뉴서울파크 젤리장수 대학살》 조예은 작가 인터뷰

[BY 책방라이브] 뉴서울파크 젤리장수 대학살 조예은 작가 인터뷰만약 마법의 젤리가 여러분 손안에 ...

m.post.naver.com

 

 

책 구입 정보

 

http://aladin.kr/p/QLS7U

 

뉴서울파크 젤리장수 대학살

조예은 장편소설. 경기도 모처에 위치한 놀이공원 뉴서울파크. 무더운 여름날을 즐겁게 보내려는 수많은 사람들이 이곳으로 몰려든다. 부모와 아이, 연인들, 인형 탈을 쓴 직원. 수수께끼의 젤��

www.aladin.co.kr

 

'독후감' 카테고리의 다른 글

공허한 십자가  (0) 2020.09.25

Q. 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

 

입력.

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

 

출력.

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

 


 

기본 베이스는 DFS 알고리즘을 이용했다.

 

우선 입력받은 컴퓨터의 번호 쌍을 바탕으로 인접 행렬을 구현한 뒤, 그리고 DFS 알고리즘에 적용하였다.

 

이 문제는 1번 컴퓨터로부터 웜 바이러스에 걸릴 수 있는 컴퓨터 수를 구하는 것이기 때문에, 

위 알고리즘에서 방문한 노드의 수 - 1 을 해주어야 한다.

 

#include <stdio.h>

#define SIZE 101

int visit[SIZE];
int a[SIZE][SIZE];

void dfs(int start, int n) {

    if (visit[start] == 1)
        return;
    
    visit[start] = 1;

    for (int i = 0; i <= n; i++) {
        if (a[start][i] == 1 && visit[i] != 1)
            dfs(i,n);
    }
}

int main(void) {
    int n, e, x, y, ans;

    scanf("%d", &n);
    scanf("%d", &e);

    while(e--) {
        scanf("%d %d", &x, &y);

        a[x][y] = 1; a[y][x] = 1;
        
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (a[i][j] != 1)
                    a[i][j] = 0;
            }
        }
    }
    
    dfs(1, n);

    ans = 0;

    for (int i = 2; i <= n; i++) {
        if (visit[i] == 1)
            ans++;
    }
    printf("%d", ans);
    
    return 0;
}

 

'백준 알고리즘' 카테고리의 다른 글

[Python] 10718번  (0) 2020.12.27
[C언어] 2884번  (0) 2020.11.10
[C언어] 2847번  (0) 2020.09.02
[C언어] 12015번  (0) 2020.08.30
[C언어] 2631번  (0) 2020.08.17

Q. 학교에서 그래픽스 수업을 들은 동준이는 수업시간에 들은 내용을 바탕으로 스마트폰 게임을 만들었다. 게임에는 총 N개의 레벨이 있고, 각 레벨을 클리어할 때 마다 점수가 주어진다. 플레이어의 점수는 레벨을 클리어하면서 얻은 점수의 합으로, 이 점수를 바탕으로 온라인 순위를 매긴다. 동준이는 레벨을 난이도 순으로 배치했다. 하지만, 실수로 쉬운 레벨이 어려운 레벨보다 점수를 많이 받는 경우를 만들었다.

이 문제를 해결하기 위해 동준이는 특정 레벨의 점수를 감소시키려고 한다. 이렇게해서 각 레벨을 클리어할 때 주는 점수가 증가하게 만들려고 한다.

각 레벨을 클리어할 때 얻는 점수가 주어졌을 때, 몇 번 감소시키면 되는지 구하는 프로그램을 작성하시오. 점수는 항상 양수이어야 하고, 1만큼 감소시키는 것이 1번이다. 항상 답이 존재하는 경우만 주어진다. 정답이 여러 가지인 경우에는 점수를 내리는 것을 최소한으로 하는 방법을 찾아야 한다.

 

입력.

첫째 줄에 레벨의 수 N이 주어진다. (1 ≤ N ≤ 100) 다음 N개 줄에는 각 레벨을 클리어하면 얻는 점수가 첫 번째 레벨부터 마지막 레벨까지 순서대로 주어진다. 점수는 20,000보다 작은 양의 정수이다.

 

출력.

첫째 줄에 점수를 몇 번 감소시키면 되는지 출력한다.

 


 

레벨이 올라갈수록 받을 수 있는 점수도 커지도록, 입력받은 수를 수정하는 문제이다.

 

즉, 중요한 것은 낮은 레벨의 점수가 높은 레벨의 점수보다 무조건 작아야 한다는 것이다.

 

문제에서 점수는 항상 양수이고, 항상 답이 존재한다고 하였으니까 arr[i] <= i + 1 인 경우는 없다.

그러므로 점수 배열 ( arr ) 에서 arr[i] > arr[i+1] 이 TRUE인 경우에만,

arr[i] 와 arr[i + 1] - 1의 차만큼 답에 더해주고, arr[i]의 값을 arr[i + 1] - 1으로 교체해주는 반복문을 만들어 준다.

 

#include <stdio.h>

int MAX(int a, int b)
{
    int max;

    if (a >= b)
        max = a;
    else
        max = b;
    
    return max;
}

int main(void)
{
    int n, ans = 0;

    scanf("%d", &n);
    
    int arr[n];

    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    for (int i = n - 2; i > -1; i--)
    {   

        if (arr[i] >= arr[i+1]) {

            ans += arr[i] - (arr[i+1]-1);

            arr[i] = arr[i+1]-1;
        }

    }

    printf("%d\n", ans);

    return 0;
}

 

'백준 알고리즘' 카테고리의 다른 글

[C언어] 2884번  (0) 2020.11.10
[C언어] 2606번  (0) 2020.09.18
[C언어] 12015번  (0) 2020.08.30
[C언어] 2631번  (0) 2020.08.17
[C언어] 1748번  (0) 2020.08.16

 

도형을 만들기 위해서는 ① xml 파일에 도형을 그리고 ② 필요한 요소에 적용하는 방식을 사용한다.

 


 

우선 shape.xml 파일을 만들고 아래와 같이 작성해주었다.

 

 

res > drawable > shape.xml

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <solid android:color="#FF5733"/>
    <stroke android:width="3dp" android:color="#DBFF33"/>
    <size android:width="350dp" android:height="350dp"/>
</shape>

 


 

<shape> .. </shape> : 도형을 그리기 위한 속성. shape 요소를 이용해 그 모양을 지정해주었다.

 

또 코드에서 사용한 shape 속성의 하위 속성은 다음과 같다.

 

<solid> : 도형을 단색으로 채울 때 사용한다.

<stroke> : 테두리의 색, 두께 등을 설정할 때 사용한다.

<size> : 도형의 크기를 지정할 때 사용한다.

 


 

위 코드의 결과는 다음과 같은 도형을 만든다.

 

 

ImageView에 적용해준 모습이다.

 

'android' 카테고리의 다른 글

[android] pie chart의 인덱스 삭제하기  (0) 2020.09.28
[kotlin][RecyclerView] 가로 정렬  (0) 2020.08.20

Q. 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {1020, 10, 30, 20, 50} 이고, 길이는 4이다.

 

입력.

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)

 

출력.

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

 


11053 번과 유사한 문제이다. 그래서 같은 코드를 제출하였더니, 시간 초과가 났다.

 

해결하기 위해 LIS 알고리즘에 대해 구글링해 본 결과, 수열의 크기가 전의 문제보다 더 크다는 점이 문제점이라는 것을 알아 냈다.

( ※ 참고 블로그 : https://jason9319.tistory.com/113 )

 

위 블로그를 통해 공부한 결과는 아래와 같다.


이 문제는 LIS 알고리즘을 이분 탐색의 방향으로 봐야 한다.

우선 특정 수열의 값을 정렬할 배열을 새로 하나를 만들어 주어야 한다.  위 블로그에서는 벡터를 이용하였는데, c언어를 사용하기 위해 stack 을 이용하였다.

 

이제 반복문을 사용하여, 수열의 값이 stack[top]의 값과 비교하는 과정을 거친다.

 

1. 수열의 값 < stack[top] 이면, 수열의 값보다 ① 크면서 ② 그 중에서 가장 작은 수와 자리를 교체해주는 lower_bound를 해준다.

 

2. 수열의 값 > stack[top] 이면, push 해준다.

 

3. 수열의 값 == stack[top] 이면, 이 과정을 뛰어 넘는다. ( = continue )

 

#include <stdio.h>

#define STACK_SIZE 1000000

int stack[STACK_SIZE];
int top = -1;

int isEmpty()
{
    if (top < 0)
        return 1;
    else
        return 0;
}

int isFull()
{
    if (top >= STACK_SIZE)
        return 1;
    else
        return 0;
}

void push(int x)
{
    if (isFull() == 0)
        stack[++top] = x;
}

int pop()
{
    if(isEmpty() == 0)
        return stack[top--];
}

int main(void)
{
    int n, tmp;

    scanf("%d", &n);

    int arr[n];

    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    push(arr[0]);

    for (int i = 1; i < n; i++)
    {
        if (stack[top] < arr[i]) 
            push(arr[i]);
        else if (stack[top] < arr[i])
            continue;
        else
        {   
            for (int j = top; j > -1; j--)
            {   
                if (arr[i] > stack[j])
                    break;

                tmp = j;
            }

            stack[tmp] = arr[i];
        }

    }
    
    printf("%d ", top + 1);
    
    return 0;    
}

 

'백준 알고리즘' 카테고리의 다른 글

[C언어] 2606번  (0) 2020.09.18
[C언어] 2847번  (0) 2020.09.02
[C언어] 2631번  (0) 2020.08.17
[C언어] 1748번  (0) 2020.08.16
[C언어] 16194번  (0) 2020.07.15

 

RecyclerView를 가로로 정렬하는 법을 정리하였다.

 

LinearLayoutManager 함수의 매개변수인 orientation 의 값을 LinearLayoutManager.HORIZONTAL로 지정해준다.

 


아래는 예시 코드이다.

 

<MainActivity 코드> 

class MainActivity : AppCompatActivity() {

    val DataList = arrayListOf(
        Data("1일"),
        Data("2일"),
        Data("3일"),
        Data("4일"),
        Data("5일"),
        Data("6일"),
        Data("7일")
   )
   
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
        recyclerView.adapter = CustomAdapter(DataList)
    }
}

 

<CustomAdapter 코드>

class Data(val date:String)

class CustomViewHolder(v : View) : RecyclerView.ViewHolder(v) {
    val dateForm = v.tv_item
}

class CustomAdapter(val DataList:ArrayList<Data>) : RecyclerView.Adapter<CustomViewHolder>(){

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
        val cellForRow = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)

        return CustomViewHolder(cellForRow)
    }

    override fun getItemCount() = DataList.size
   
    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
        holder.dateForm.text = DataList[position].date
    }
}

'android' 카테고리의 다른 글

[android] pie chart의 인덱스 삭제하기  (0) 2020.09.28
[android] 도형 그리기 (원)  (0) 2020.08.30

+ Recent posts