다른 사람에게 해만 끼치지 않는다면 개인의 자유는 절대적으로 보장되어야 한다.

 

이것이 밀의 자유론을 관통하는 한 문장이라고 할 수 있다. 밀은 이 명제를 자유론을 통해 열정적으로 주장한다.

 

 

 

서론

 

오늘날 한국 사회에서는 누구든지 자유롭게 표현할 수 있는 동시에 내가 소중한 만큼 타인을 아껴주어야 한다는 것을 요구한다. 명예훼손법 등의 사례를 보면 개인의 자유를 조금 과하게 억압하는 면도 한국에는 존재하는 것같다고 생각한다. 명예훼손의 사법적 기준을 타인의 사회적 명성에 커다란 피해를 입히는 경우 사실을 적시하는 행위조차 명예훼손죄의 형사처벌대상이 될 수 있기 때문이다. 명예훼손이 굉장히 예민한 문제로 대두되고 있는 이유이다.

 

밀은 현대사회의 비극에 대해 2가지를 말한다. 첫째로 남의 습성을 무분별하게 따라한다는 점이다. 점점 자신만의 개성이 사라지고 몰개성의 시대로 변질되어질 수 있다고 우려한다. 둘째로 자기확신의 과잉이다. 인간의 불완전함을 인정하면서도 자기확신이 너무나 강해지는 탓에 타인의 의견을 존중하지 않는 현상이 발생한다.

 

자유론을 통해 밀은 자기방식대로 살아가는 '개별성'을 강조한다. 다른 사람의 자유를 박탈하거나 침해하지 않는 한 자신의 개성대로 삶을 영위하고 꾸려나갈 권리가 있어야 한다고 주장한다.

 

다른 사람의 자유를 침해할 수 있는 유일한 경우는 자기보호, 즉 타인에게 해를 끼치는 것을 막는 때 뿐이다. 해를 막기 위한 목적이라면 당사자의 의지에 반하더라고 그 행위가 정당하다고 할 수 있다. 하지만 타인에게 해를 끼친다는 분명한 증거가 존재하지 않는 이상 타인의 자유를 침해할 수 없다고 밀은 단언한다. 각 개인은 자신의 몸과 정신의 유일한 주권자이다.

 

인간자유의 기본영역

1. 내면적 의식 영역의 자유 : 양심과 생각, 표출의 자유, 절대적 의견과 주장의 자유를 누려야 한다.

2. 희망하는 것을 추구할 자유 : 자신의 개성에 맞게 삶을 설계하고 살아갈 수 있음을 의미한다.

3. 결사의 자유 : 자유롭게 어떤 목적의 모임을 만들 수 있다.

밀은 자신의 삶을 자신의 개성에 맞춰 자유롭게 꾸려나갈 수 있는 것이 가장 소중한 자유라고 말한다.

그는 생각과 토론의 자유 그리고 개별성에 대해 심도있고 길게 서술한다.

 

 

 

2부 생각과 토론의 자유

 

한 사람이 다른 생각을 가지고 있다고 해서 침묵을 강요하는 것은 결코 용인 될 수 없다.

그 생각이 옳든 옳지 않든 그들의 주장을 이해하려고 하고 토론하는 과정을 통해 얻을 수 있는 이점이 거대하기 때문이다.

 

 

1. 만약 그 의견이 옳다면 기존의 잘못을 드러내고 진리를 찾는 기회를 박탈하는 것이다.

 

인간의 사유는 절대적으로 완벽할 수 없다. 그래서 우리의 생각이 아무리 옳다고 생각하더라도 그것을 타인의 의견을 짓밟는 데에 이용되어서는 안된다. 이런 착각에 빠지면 타인의 의견을 절대 용인할 수 없다. 반대로 인간의 사고가 불완전하다고 해서 그 누구도 판단하지 않으려는 것도 문제가 된다. 자신의 의견을 강요하는 것은 잘못된 것이지만 각 개인과 정부는 양심에 따라 최선을 다해 판단하기 위한 노력을 기울여야 한다.

 

자신의 생각이 자신의 행동을 인도하는 길잡이라고 믿어야 한다. 논박의 기회를 봉쇄하기 위해 어떤 사실을 진리로 가정하는 것과 어떤 사실이 논박을 거치면서 허점이 발견되지 않아 진리로 가정하는 것은 본질적으로 다르다. 우리의 의무는 자신의 생각에 대한 최소한의 확신을 가지고 끈질기게 토론을 하는 것이다. 완벽한 진리는 없으며 토론의 과정을 통해 이전보다 더 견고한 진리를 추구할 수 있다. 인간이 발전한 이유는 자신의 잘못과 과오를 인정하고 그것으로부터 돌이키는 능력에서 비롯된다. 자신의 생각과 상반되는 타인의 의견을 이해하고 검증하고 그것이 옳다면 수용해야 한다. 이러한 토론의 과정을 통해서만 더욱 단단한 진리를 가질 수 있다. 만약 사회적인 큰 원칙에 대해 우리가 시비를 걸 수 없다면, 인간의 역사를 아름답게 빛내주면 거대한 규모의 정신활동이 일어날 수 없다. 밀은 마음놓고 믿는 것일 수록, 세상앞에서 더 철저한 검증을 받아야 한다는 것을 강조한다.

 

밀은 종교개혁과 탄압의 사례를 통해 자신들의 주장이 전적으로 옳다는 착각에서 비롯된 권력층의 횡포와 역사 속 비극에 대해 이야기 한다.

 

 

2. 만약 그 의견이 옳지 않다면 틀린의견과 옳은 의견의 대비를 통해 진리를 더 명확히 할 수 있는 기회를 잃는 것이다.

 

자신의 주장이 아무리 옳다고 생각하더라고 지속적이고 끈질긴 토론과 검증이 없다면 그것은 죽은 독단이다. 밀은 이에 대해 "확전된 결론은 깊은 잠에 빠진다"고 말한다.  치열한 토론을 끈질기게 거치지 않는다면 그것을 받아드리는 대부분의 사람들이 주장의 근거를 이해하거나 느끼지 못한채로 그저 편견으로 받아들일 수 있다. 그 생각이 매우 진실한 것 처럼 보여도 실은 검증되지 않는 편견일 수 있다. 지선을 단련시키는 방법 중 으뜸은 자신이 옳다고 생각하는 자중에 대한 근거를 학습하는 것이다.

 

수학과 같은 학문은 특이성을 지닌 까닭에 주장에 대한 의심의 여지가 존재하지 않는다. 그 외 학문은 즉 , 생각의 차이가 불가피한 분야에서는 상반된 의견을 종합하여 진리를 찾아야 한다. 어떤 생각이 증명되고 그 증명을 알기 전까지는 우리가 옳다고 믿는 것의 근거를 알 수 없다. 자신의 주장에 대해 아는 것 만큼 반대 견해의 입장을 이해하기 위해 노력해야 한다. 오늘날의 교육이 선생이나 책을 통한 주입식으로 지식을 얻는 방식이기 때문에 보통사람들은 물론이며 사상가들 보자 자신과 상반된 견해에 대해 두루 잘 아는 경우가 드물다.

 

하지만 현실에서는 어느 한쪽의 주장이 옳고 다른 한쪽의 주장이 틀리는 경우는 드물다. 오히려 양쪽에서 부분적으로 진리를 담고 있는 경우가 대다수이다. 이때 우리는 서로의 주장과 논거를 이해하려고 노력함과 동시에 끈질긴 토론을 통해서 진리를 추구할 수 있다.

 

 

 

다른 견해를 가지며 표현할 수 있는 자유가 인간복리에 긍정적인 4가지 이유

 

1. 침묵당하는 모든 의견은 진리한 가능성이 있다.

2. 침묵당하는 의견이 틀린것일 지라도 부분적으로 진리를 담고 있을 수 있다. 이는 매우 드물다. 하지만 대립하는 의견을 부딫치게 하는 것이 더 나은 진리를 위한 유일한 방법이다.

3. 주장이 전적으로 옳은 것이라고 하더라도 진지하고 어려운 시험을 받지 않는 다면 그것을 받아드리는 사람들은 그 진리의 합리적인 근거를 이해하지도 느끼지도 못한다. 그저 하나의 편견으로 자리잡을 뿐이다.

4. 또한 그 주장의 의미 자체가 실종되거나 퇴생되면서 사람들의 성격과 행동에 큰 영향을 미치지 못하게 될 수 있다.

 

 

 

제 3장 개별성 :행복한 삶을 위한 중요한 요소

 

밀은 개인이 자신의 삶을 각자의 개성대로 이루어 나가는 개별성을 강조한다. 물론 이때 행동에 대한 책임은 개인에게 있으며, 타인에게 피해를 끼치는 경우 그 제재는 정당하다.

 

개별성은 삶을 삶아가는 과정 속 성공 혹은 실패를 겪으면서 피드백을 통해 더 나은 삶을 살도록 돕는다. 하지만 사회적 관습이나 주변환경에 의해 행동한다면 결코 행복해 질 수 없을 것이다. 어느 누구도 자신이 그저 타인을 따라 살아가는 삶을 좋을 삶이라 생각하지 않기 때문이다. 과거보다 더 나은 지금은 만든 것은 개인이 가진 개별성이 잘 발현되었기 때문이다.

 

은 정부가 개인이 개별성을 발휘할 수 있는 환경을 성해야 한다며 어떤 민족이 번영을 누리다가 쇠퇴기에 접어드는 때가 바로 이 개별성을 가볍게 여기는 때라고 비판한다.

 

 

 

제 4장 사회가 개인에 대해 행사할 수 있는 권한의 한계

 

법적으로 부여된 타인의 권리를 침해하는 경우 사회가 당사자에 대해 사법적 권한을 행사할 수 있다. 타인의 법적 권리를 침해하지 않는 경우라 하더라도 타인에게 해를 주거나 사려깊은 고려를 하지 않을 경우 여론을 통해 정당한 처벌을 가하거나 비판의 대상으로 삼을 수 있다.

 

타인에게는 해가 없고 오로지 자기 자신에게만 문제가 될 경우도 있을 수 있다. 이때 개인이 감수하는 불이익은 타인의 비우호적인 시선에 대한 불편함 그 뿐이다. 이것은 자기자신에 대한 의무, 즉 자존심과 자기 발전의 차원이다.

 

하지만 현실에서는 오로지 자기 자신에게만 영향을 미치는 것은 거의 존재하지 않는다. 도박과 같은 '나쁜 취미'의 경우 겉으로 본인에게만 고통을 가하는 행동일 뿐 아니라 가정의 평화와 안정을 붕괴시키는 결과를 초래할 수도 있다. 자신의 취미생활이라도 그것이 주변 사람에게 고통을 안겨준다면 비난받아 마땅하고 그 책임의 결과가 중한 경우 사법적 재제가 정당화 되어야 한다.

 

술취한 것은 문제가 되지 않지만 경찰이나 군인이 근무시간에 술취하는 것은 명백히 공공에 해를 가할 가능성이 분명해지기 때문에 자유의 영역에서 벗어난다. 이는 곧 도덕 혹은 법률의 적용대상이 된다. 부작위에 의한 경우이다.

 

 

 

 

정부의 간섭을 반대하는 이유

 

밀은 자유를 침해하지 않더라도 정부의 간섭을 반대한다고 주장한다.

1. 어떤 종류의 선택이나 결정에 있어서 이해관계의 당사자 만큼 적합한 사람은 없다.

2. 개별성을 발전시키고 다양한 행동을 추구함으로써 우리는 대단히 많은 이익을 취할 수 있다.

이는 개별성에 대하여 지금까지 밀이 주장한 바 이다.

3. 이미 비대해진 정부의 권력을 더 이상 강화시켜서는 안된다.

- 정부가 그들이 옳다고 생각하는 방향으로라도 개인을 통제하기 시작하면, 개인은 스스로의 힘으로 무언가를 하기보다 국가와 관료들에게만 의지하는  상황이 초래될 수 있다. 이는 개별성의 부재로 이어진다.

- 정부와 대등한 능력으로 그들에게 비판할 아무 존재도 없어진다.

 

 

 

마치며

 

밀은 인간의 이성을 믿었다. 웬만한 경험과 지식을 가진 인간이라면 올바른 선택을 할것을 말이다. 이 올바른 선택은 좋은 결과를 가져올 것이다. 따라서 방향만 옳다면 구체적인 경로나 방법은 개인의 자율에 맡겨야 한다. 사람에 따라 그 모양이 달라질 수 있는 것이다. 이것이 개별성이다. 방향을 전제한 자유, 이것이 밀의 생각이다.

https://www.acmicpc.net/problem/2606

 

2606번: 바이러스

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

www.acmicpc.net

문제

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

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

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

 

입력

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

 

출력

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

 

접근방식

기본적인 bfs 혹은 dfs로 풀수 있는 단순 탐색문제이다. 1번 컴퓨터를 시작 노드로 하여 1번과 연결된 노드의 수를 구하는 것이다.

- bfs를 사용하였다.

- queue에서 인덱스를 하나 꺼낼때마다 count를 1씩 증가시켜서 연결된 노드의 수를 구했다.

- 1번자체는 연결된 노드에서 제외해야하므로 dfs return value는 count에서 1을 뺀 값이다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

vector<int> a[101];
queue<int> q;
int v[101]={0,};

int bfs(int start, int count){
  q.push(start);
  v[start]=1;
  while(!q.empty()){
    int x = q.front();
    count++;
    //printf("x = %d\n", x);
    q.pop();
    for(int i=0; i<a[x].size(); i++){
      int index = a[x][i];
      if(v[index]==0){
        v[index]=1;
        q.push(index);
      }
    }
  }
  return count-1;
}

int main(){
  int n,m,count=0; cin >> n >> m;
  int x,y;
  for(int i=0; i<m; i++){
    cin >> x >> y;
    a[x].push_back(y);
    a[y].push_back(x);
  }
  cout << bfs(1,count) << "\n";
}

https://www.acmicpc.net/problem/1389

 

1389번: 케빈 베이컨의 6단계 법칙

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻

www.acmicpc.net

케빈 베이컨의 6단계 법칙 

 

문제

케빈 베이컨의 6단계 법칙에 의하면 지구에 있는 모든 사람들은 최대 6단계 이내에서 서로 아는 사람으로 연결될 수 있다. 케빈 베이컨 게임은 임의의 두 사람이 최소 몇 단계 만에 이어질 수 있는지 계산하는 게임이다.

 

예를 들면, 전혀 상관없을 것 같은 인하대학교의 이강호와 서강대학교의 민세희는 몇 단계만에 이어질 수 있을까?

천민호는 이강호와 같은 학교에 다니는 사이이다. 천민호와 최백준은 Baekjoon Online Judge를 통해 알게 되었다. 최백준과 김선영은 같이 Startlink를 창업했다. 김선영과 김도현은 같은 학교 동아리 소속이다. 김도현과 민세희는 같은 학교에 다니는 사이로 서로 알고 있다. 즉, 이강호-천민호-최백준-김선영-김도현-민세희 와 같이 5단계만 거치면 된다.

케빈 베이컨은 미국 헐리우드 영화배우들 끼리 케빈 베이컨 게임을 했을때 나오는 단계의 총 합이 가장 적은 사람이라고 한다.

오늘은 Baekjoon Online Judge의 유저 중에서 케빈 베이컨의 수가 가장 작은 사람을 찾으려고 한다. 케빈 베이컨 수는 모든 사람과 케빈 베이컨 게임을 했을 때, 나오는 단계의 합이다.

 

예를 들어, BOJ의 유저가 5명이고, 1과 3, 1과 4, 2와 3, 3과 4, 4와 5가 친구인 경우를 생각해보자.

1은 2까지 3을 통해 2단계 만에, 3까지 1단계, 4까지 1단계, 5까지 4를 통해서 2단계 만에 알 수 있다. 따라서, 케빈 베이컨의 수는 2+1+1+2 = 6이다.

2는 1까지 3을 통해서 2단계 만에, 3까지 1단계 만에, 4까지 3을 통해서 2단계 만에, 5까지 3과 4를 통해서 3단계 만에 알 수 있다. 따라서, 케빈 베이컨의 수는 2+1+2+3 = 8이다.

3은 1까지 1단계, 2까지 1단계, 4까지 1단계, 5까지 4를 통해 2단계 만에 알 수 있다. 따라서, 케빈 베이컨의 수는 1+1+1+2 = 5이다.

4는 1까지 1단계, 2까지 3을 통해 2단계, 3까지 1단계, 5까지 1단계 만에 알 수 있다. 4의 케빈 베이컨의 수는 1+2+1+1 = 5가 된다.

마지막으로 5는 1까지 4를 통해 2단계, 2까지 4와 3을 통해 3단계, 3까지 4를 통해 2단계, 4까지 1단계 만에 알 수 있다. 5의 케빈 베이컨의 수는 2+3+2+1 = 8이다.

5명의 유저 중에서 케빈 베이컨의 수가 가장 작은 사람은 3과 4이다.

 

BOJ 유저의 수와 친구 관계가 입력으로 주어졌을 때, 케빈 베이컨의 수가 가장 작은 사람을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻이다. A와 B가 친구이면, B와 A도 친구이며, A와 B가 같은 경우는 없다. 친구 관계는 중복되어 들어올 수도 있으며, 친구가 한 명도 없는 사람은 없다. 또, 모든 사람은 친구 관계로 연결되어져 있다. 사람의 번호는 1부터 N까지이며, 두 사람이 같은 번호를 갖는 경우는 없다.

출력

첫째 줄에 BOJ의 유저 중에서 케빈 베이컨의 수가 가장 작은 사람을 출력한다. 그런 사람이 여러 명일 경우에는 번호가 가장 작은 사람을 출력한다.

 

문제접근방식

각 사람에 대해 bfs를 실행하면서 자신을 제외한 모든 사람의 케빈 베이컨 수를 구한다.

그 후 케빈 베이컨 수를 각각 계산하여 최소값을 출력한 후 종료한다.

 

- A에 대한 B의 케빈 베이컨 수가 X라면 B와 연결된(A가 아닌) 사람의 케빈 베이컨 수는 B의 케빈 베이컨 수인 X에 1을 더한 값이다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

vector<int> a[101];
int rs[101][101];
queue<int> q;

void bfs(int start){
    int v[101]={0,};
    q.push(start);
    v[start]=1;
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i=0; i<a[x].size(); i++){
            int index = a[x][i];
            if(v[index]==0){
                v[index]=1;
                q.push(index);
                rs[index][start] = rs[x][start]+1;
                rs[start][index] = rs[start][x]+1;
               // printf("%d, %d : %d\n", start, index, depth);
            }
        }
    }
}

int main()
{   
    int n,m; cin >> n >> m;
    int x,y;
    int sum=0, result=0, min=2000000000;
    for(int i=0; i<m; i++){
        cin >> x >> y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            rs[i][j]=0;
        }
    }
    
    for(int i=1; i<=n; i++)
        bfs(i);
        
    for(int i=1; i<=n; i++){
        sum=0;
        for(int j=1; j<=n; j++){
            sum+=rs[i][j];
        }
        if(min > sum){ 
            min = sum;
            result = i;
        }
    }
    
    cout << result << "\n";

    return 0;
}

'알고리즘 문제풀이' 카테고리의 다른 글

[백준] 7576번 토마토 c++  (0) 2021.07.06
[백준] 2060번 바이러스 c++  (0) 2021.07.03
[백준] 2178번 미로 탐색 c++  (0) 2021.07.02
[백준] 1260번 DFS와 BFS c++  (0) 2021.07.02
[백준] 15735번 삼각 c++  (0) 2021.06.24

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

미로 탐색

문제

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

입력

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

 

접근방식

기본적인 BFS 문제라고 할 수 있다.

 

고려해야할 사항

- 이동할 수 있는 정점이 상,하,좌,우 4방향으로 한정되어 있다

이를 위해 (N+2)*(M+2) 배열을 만들어 가장자리의 미로 인덱스 값들을 0으로 설정해주었다.

- 탐색시 사용되는 데이터가 2개의 정수이다.

vector<pair<int, int>>를 이용하여 bfs를 구현하였다. 

 

bfs를 진행하면서 N,M의 자리에 도착할 경우 count한 횟수를 출력하고 종료한다.

#include <iostream>
#include <vector>
#include <queue>
#include <string>

using namespace std;

int n,m;
int it[102][102];
int res[102][102];
int v[102][102];
queue<pair<int, int>> q;

void bfs(){
    q.push(make_pair(1,1));
    v[1][1]=1;
    res[1][1]=1;
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        if(x==n && y==m){
            printf("%d\n", res[x][y]);
            return ;
        }
        if(v[x-1][y]==0 && it[x-1][y]==1){
            v[x-1][y]=1;
            res[x-1][y]=res[x][y]+1;
            q.push(make_pair(x-1,y));
        }
        if(v[x+1][y]==0 && it[x+1][y]==1){
            v[x+1][y]=1;
            res[x+1][y]=res[x][y]+1;
            q.push(make_pair(x+1,y));
        }
        if(v[x][y+1]==0 && it[x][y+1]==1){
            v[x][y+1]=1;
            res[x][y+1]=res[x][y]+1;
            q.push(make_pair(x,y+1));
        }
        if(v[x][y-1]==0 && it[x][y-1]==1){
            v[x][y-1]=1;
            res[x][y-1]=res[x][y]+1;
            q.push(make_pair(x,y-1));
        }
        
    }
}

int main()
{   
    cin >> n >> m;
    string a[102];
    for(int i=0; i<102; i++){
        for(int j=0; j<102; j++){
            it[i][j]=0;
            res[i][j]=0;
            v[i][j]=0;
        }
    }
    
    for(int i=1; i<=n; i++){
        cin >> a[i];
    }
    
    for(int i=1; i<=n; i++){
        for(int j=0; j<m; j++){
            it[i][j+1] = a[i][j]-48;
        }
    }
    for(int i=0; i<=n+1; i++){
        for(int j=0; j<=m+1; j++){
            //printf("%d, %d : %d\n", i, j,it[i][j]);
        }
        //printf("\n");
    }
    //printf("input is done\n");
    bfs();
    
    return 0;
}

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

출력

첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 

문제접근

bfs / dfs에 대한 기본문제였다.

추가적으로 고려해야 할 사항은 방문할 수 있는 간선이 여러개일 때 번호가 낮은 간선부터 방문해야 한다는 것이다. 이는 각 그래프 간선에 연결되어 있는 인덱스들을 오름차순으로 정렬하여 해결했다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

vector<int> a[1001];
queue<int> q;
int v[1001]={0,};

void BFS(int start){
  int vb[1001]={0,};
  q.push(start);
  vb[start]=1;
  printf("%d ", start);
  while(!q.empty()){
    int x = q.front();
    q.pop();
    for(int i=0; i<a[x].size(); i++){
      int index = a[x][i];
      if(vb[index]==0){
        vb[index]=1;
        q.push(index);
        printf("%d ", index);
      }
    }
  }
}

void DFS(int x){
  printf("%d ", x);
  v[x]=1;
  for(int i=0; i<a[x].size(); i++){
    int index = a[x][i];
    if(v[index]==0){
      v[index]=1;
      DFS(index);
    }
  }
}
int main(){
  int n,m,v; cin >> n >> m >> v;
  int x,y;
  for(int i=0; i<m; i++){ // 간선개수만큼 입력받기 vector를 이용
    cin >> x >> y;
    a[x].push_back(y);
    a[y].push_back(x);
  }
  //1~n까지의 인덱스를 이용
  // test code
  for(int i=1; i<=n; i++){ // 각 간선의 연결된 index들을 오름차순으로 sort
    sort(a[i].begin(), a[i].end());
    for(int j=0; j<a[i].size(); j++){
      //printf("%d",a[i][j]);
    }
    //printf("\n");
  }
  DFS(v);
  printf("\n");
  BFS(v);

  return 0;
}

 

그릿의 의미

그릿은 한국어로 표현할 적확한 단어가 없다. 그나마 끈기나 열정으로 대체될 수 있다고 한다.

성공하는 사람의 요인으로 그릿을 주장한다.

 

성취의 정의

성취 = 재능 x 노력^2이다.

재능 x 노력 = 기술

기술 x 노력 = 성취

재능도 물론 중요하지만 그것의 배로 영향을 미칠 수 있는 요인이 바로 노력이라는 것을 저자는 강조한다.

 

그릿을 기르는 방법

1. 관심

열정은 자기성찰로 부터 생기지 않는다. 외부 세계와 상호작용이 계기가 되어 흥미가 생긴다. 다양한 경험을 많이 해야 한다.

 

2. 연습

가장 큰 깨달음은 관심분야에 대한 열정을 노력으로써 발전시켜 키워야 한다는 것이다. 누구나 어딘가에 흥미가 생겨 그것을 시작해본 경험이 있을 것이다. 아마 그 흥미가 그리 오래가지 않았을 경우가 종종 있었을 것이다. 여기서  저자는 '의식적 연습'을 강조한다. 의식적 연습은 노력을 함에 있어서 집중과 밀도있어야 한다는 것을 의미한다. 최고가 되고 싶다면 의식적 연습을 해야한다.

 

3. 목적

타인의 행복에 기여하려는 의도를 가져야 한다.

어떤 일이든지 자신이 하는 일이 타인이나 전체 사회와 어떤 연관이 있는지, 자신이 중시할 수 있는 가치를 표현할 수 있는지를 질문해야 한다. 자신의 일과 미래에 대한 친사회적 동기와 자기지향적 동기가 만날때 최고의 성취를 발휘할 수 있다. 친사회적 동기는 사랑, 사회적 각치 등 누군가를 돕거나 의미있는 일을 한다는 것을 말하며, 자기지향적 동기는 개인적으로 흥미가 있거나 좋아하는 일을 한다는 것이다.

 

4. 희망

어떠한 상황에 있든지간에 계속 앞으로 나아가기 위해서는 희망을 가져야 한다. 저자가 말하는 희망은 내일이 더 나아질 것 같다는 느낌이 아니라 나은 내일을 만들겠다는 적극적인 결심이다.

 

그릿의 성장원리

그릿은 내가 해결할 수 있는 역경에서 그 극복의 경험을 통해 성장한다. 근면성과 끝기는 노력하면 얻어질 수 있다. 미친듯이 노력하면 이룰 수 있다.

 

행동을 이끄는 법

- 현명한 육아방식은 진심어린지지와 더불어 요구하는 육아방식이다.

- 동기를 부여해주고 함께 앉아 구체적인 계획을 코치해 주는 것이다.

 

당연한 말이겠지만 부자가 되는 방법에 왕도는 없다. 항상 친절하고 작은 돈과  물건들을 소중히 다루고 타인을 존중하며 근면, 성실하는 데에서부터 시작되는 것이다.

 

부자가 되기 위해서

언어, 수학, 기초학문에 대한 공부하기

대한민국 1등 대기업의 주식을 꼬박꼬박 매달 모으기

집 물건부터 정리하기

전반적인 금융개념들을 잘 정리해둔 책으로 저자는 한국은행이 발간한 '경제 금융용어 700선'을 추천한다.

 

 

직장에서 부자가 되는 법

승진을 통한 성공

1. 맡은 일에 충실하라 -> 보고 잘하기, 급여의 3배 수익을 올려라

2. 인사를 잘하라

3. 금여 20%로 종잣돈을 만들고 투자하라. 직업이 2개인 것 처럼 말이다.

 

가치 투자를 하라.

재무제표에 대해 공부해라. 내가 그 회사의 사장인것처럼 생각하고 종일 들여다 보아라.

 

돈은 인격체이다

걸인이 버리고 간 3페니(약 11원)을 비를 맞으면서 주웠다. 그의 주머니에 소중히 담긴 3개의 동전. 그것은 돈의 씨앗임을 기억하자.

부자가 되기 전에 부자의 마인드를 갖다. 그들의 습관을 갖다. 태도.

작은 소기업에 들어가 회사와 사업에 관해 많은 것들을 배우자. 여기서 소기업이란 직원이 3~4명 정도여서 내가 많은 일을 할 수 있는 회사이다. 그리고 창업하자 도전하고 실패하자. 열정과 끈기를 가지고 말이다.

 

돈을 모으는 습관 4가지

같은 시간에 자고 같은 시간에 일어난다.

자고 일어난 자리를 정리한다.

눈뜨자 마자 기지게를 핀다

일어나자 마자 찬물을 마신다

=> 내가 하고 있는 습관이었다.

 

 

실행할 것들

1. 가치투자 시작하기

 - 특정분야 1등 기업(한국최괴의 기업)에 매달 주식사기

 - 재무제표 공부하기

 - 한달에 1권은 금융관련 독서하기

2. 소기업에 들어가 회사와 사업에 관해 많은 경험들을 쌓기. 그리고 창업하고 도전하고 실패하기.

 

주식이 올라가든 내려가든 그것은 우리의 영역이 아니다. 운좋은 일시적 수입이 아닌 어떤 상황에서든 돈을 벌 수 있느 나만의 시나리오를 만들어야 꾸준히 그리고 장기적으로 돈을 벌 수 있다.

이 대목을 읽으면서 인공지능으로 주식 차트 분석해서 주식을 예측하는게 과연 의미가 있을 까? 하는 의문이 들었다. 세상은 예측가능할 만큼 단순하지 않다. 아무리 인공지능으로 학습한다고 해도 당장 내일도 어떻게 될지 모르는 이 세상을 예측한다는 것은 조금 안일하다는 생각이 들기도 하다. 머신러닝 공부중에 있는 지금으로서의 내 개인적인 의견이다.

 

지수의 중요성

김종봉은 지수의 중요성을 강조한다. 다음과 같은 이유에서이다.

1. 지수는 실질적인 경기를 선행해서 대변한다.

지수가 올라가면 경기호황, 지수가 내려가면 경기불황이 올 확률이 높다.

2. 지수는 누구에게나 공평하고 공정하다.

3. 지수는 정확하게 수치화되어 있다.

 

자신만의 주관과 시나리오

4가지 항목에 따라 시나리오가 달라질 수 있다.

환경 - 정보접근성이 매우 높은 시대이다. 누구나 환경은 극복가능하다.

성향 - 투자를 해보면서 공격적인지 혹은 안정적인지 성향을 파악하라.

나이 - 젊은 20~30대는 실패하더라도 배움을 얻을 수 있는 투자물 즉 high risk, high return을 권한다.

현재 돈의 크기 - 투자실력/성과는 자본의 크기와 상관없다. 오히려 적은 돈이 나만의 시나리오를 만드는데 유리하다.

 

시나리오의 평기 기준

1. 객관성 : 수치화하라 (예를 들어, 과거대비 현재가 2만원에서 1만원으로 싸다)

2. 논리성 : 수치화된 시나리오가 얼마나 설득력이 있는가?

3. 수익성 : 수익성과 안정성은 반비례한다. 돈 공부를 하는 이유도 나만의 시나리오를 통해 족은 비용으로 많은 수익을 올리된 위험성을 낮추기 위함이다.

4. 지속성 : 장시적으로 반복 운영되어 꾸준한 수익을 가져가야 한다.

 

반토막 전략

코스피 지수가 반토막 났을 때 위험이 온것이라고 정의한다. 기다리면 어떤 위험인지 알아서 이름이 정해진다. 위험이 온 그때가 투자할 때라고 저자는 말한다.

먼저 위험을 구분해야 한다.주식시장에서의 위험은 2가지다. 투자물의 위기와 시장의 위기이다. 전자는 내부요인에 의한 것이며 후자는 외부요인의 의한 것이다. 위기가 왔을 때(반토막), 그 위기의 특성을 파악하여 분할매수 or 일괄매수 할 것인지 정한다. 그리고 매도 타이밍을 결정한다.

 

매수

외부요인에 의한 위기 50% 25% 25%

내부요인에 의한 위기 30% 30% 40%

만약 매수가를 이탈한다면 전량매도 후에 다음 하락을 기다린다.

 

매도

수익율 30%일때 -> 보유 주식의 30%를 매도

수익율 50%일때 -> 보유 주식의 30%를 매도

수익율 70%일때 -> 보유 주식의 40%를 매도

 

 

+ Recent posts