tmux install

apt-get update  
apt-get install -y sudo  
apt-get install -y tmux

tmux command

session 생성

tmux new -s new_session

session 조회

tmux ls

session 접속

$ tmux attach -t new_session

패널

  • 가로로 나누기 Ctrl + b, "

  • 세로로 나누기 Ctrl + b, %

  • 패널 이동하기 Ctrl + b, 방향키

  • 패널 삭제하기 Ctrl + b, x

윈도우

  • 윈도우 생성 Ctrl + b, c

  • 윈도우 선택 Ctrl + b, 숫자키

  • 윈도우 삭제 Ctrl + b, x

iTerm2 install

brew install iterm2

iTerm font 변경하기

font 설치

iTerm font 적용

  • command + ,
  • Profiles -> Text -> Font -> Fira Code
  • ligatures font 체크

Status bar 추가하기

  • command + ,
  • Profiles -> Session -> Status bar enabled 체크
  • Configure Status Bar에서 원하는 component 드래그해서 배치

Color preset 변경하기

  • command + ,
  • Profiles -> Colors -> Color Presets...
  • Pastel (Dark Background) 클릭

'Programming > MAC' 카테고리의 다른 글

MAC 초기설정 - brew 설치  (0) 2023.05.09

terminal 실행

  • command + space
  • terminal 검색 실행

macOS 용 패키지 관리자 설치 - brew

/bin/bash -c "$(curl -fsSL [https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"](https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)")

path 추가하기

vi ~/.zshrc
# ~/.zshrc
export PATH=$PATH:/opt/homebrew/bin
source ~/.zshrc

'Programming > MAC' 카테고리의 다른 글

MAC 터미널 초기설정 - iTerm2 설치  (0) 2023.05.09

더 지니어스 2기 롤브레이커 1화 (룰 변형)
- 동물의 호구왕국

=== 플레이어 수 ===
플레이어 : 5-7명
사회자 : 1명

=== 게임 진행 ===
1. 각 플레이어는 랜덤으로 동물을 선택한다.

2. 플레이어는 이동할 필드를 선택한다.
(이동할 필드는 각 플레이어가 딜러에게 1대1로 알려주며 모든 플레이어가 선택한 후에 이동을 한다.)

3. 플레이어는 선택한 동물의 스킬을 사용하여 포인트를 획득한다.
그리고 모든 플레이어는 같은 필드의 플레이어 하나를 포식을 해도 되고 안해도 된다.
(스킬은 각 플레이어가 딜러에게 1대1로 알려주며 모든 플레이어가 스킬을 사용한 후에 포인트 계산을 한다.)

4. 모든 플레이어의 스킬 사용이 완료되면 각 동물이 획득한 포인트를 공개한다.
(각 라운드의 플레이어의 이동과 공개 되는 동물들의 포인트로 상대 플레이어의 동물을 예측해야 한다.)

5. 2~4를 반복하여, 4라운드에서 포인트가 가장 많은 플레이어가 승리한다.

==== 필드와 동물 ====
필드는 3종, 동물은 7종이며 각 동물은 자신만의 서식지가 존재한다.

숲 : 카멜레온, 까마귀
들 : 사자, 하이에나
강 : 악어, 독뱀
서식지 없음 : 고라니

===== 포인트 획득법 =====
각 라운드마다 포인트가 정해져 있고 각 동물은 스킬을 사용하여 라운드의 포인트를 획득한다. 단 필드 이동시에 자신의 서식지가 아닌 곳으로 이동했다면 다음 라운드에서 자신의 서식지로 이동을 해야 다은 라운드에서 포인트 획득이 가능하다.

1. 사자, 악어 - 포식자
사자, 악어는 같은 필드에 있는 플레이어 중 한 명을 포식했을 때, 그 플레이어가 "피식자"라면 포인트를 획득한다.

• 피식자 = {까마귀, 하이에나, 카멜레온, 고라니}
* 피식자는 포식자에게 포식을 당하면 그 라운드에서 포인트를 절반만 획득할 수 있다.

2. 독뱀 - 중립자
독뱀은 "포식을 당할 경우"에 포인트를 획득한다. 또한 같은 필드에 있는 플레이어 중 한 명을 포식했을 때, 그 플레이어가 "포식자"라면 포인트를 획득한다.

3. 하이에나
같은 필드에 있는 플레이어 중 한 명을 선택한다. 그 플레이어가 포인트를 획득 조건이 갖춰지면 대신 포인트를 획득한 다. 선택된 플레이어는 포인트를 획득할 수 없다.


4. 까마귀
매 라운드마다 한명의 플레이어의 동물을 예측해서 맞추면 포인트를 획득한다. 플레이어를 중복되게 선택할 수 없다.

5. 카멜레온
게임 시작 전, 각 라운드에 변신할 동물을 중복되지 않게 선택해서 플레이한다. 단 그 동물의 스킬만 갖어올 뿐, 피식자의 특징은 변하지 않는다.


6. 고라니
고라니는 서식지가 존재하지 않으며 자유롭게 필드 이동이 가능하다. 포식당하지 않는 라운드에서 점수를 획득한다.


==== 라운드 당 획득 가능 포인트 ====
1라운드 : 1
2라운드 : 2
3라운드 : 2.2
4라운드 : 3.3

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

 

10797번: 10부제

서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금지하는 �

www.acmicpc.net

문제

서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금지하는 것이다. 예를 들어, 자동차 번호의 일의 자리 숫자가 7이면 7일, 17일, 27일에 운행하지 못한다. 또한, 자동차 번호의 일의 자리 숫자가 0이면 10일, 20일, 30일에 운행하지 못한다.

여러분들은 일일 경찰관이 되어 10부제를 위반하는 자동차의 대수를 세는 봉사활동을 하려고 한다. 날짜의 일의 자리 숫자가 주어지고 5대의 자동차 번호의 일의 자리 숫자가 주어졌을 때 위반하는 자동차의 대수를 출력하면 된다.

입력

첫 줄에는 날짜의 일의 자리 숫자가 주어지고 두 번째 줄에는 5대의 자동차 번호의 일의 자리 숫자가 주어진다. 날짜와 자동차의 일의 자리 숫자는 모두 0에서 9까지의 정수 중 하나이다. 

출력

주어진 날짜와 자동차의 일의 자리 숫자를 보고 10부제를 위반하는 차량의 대수를 출력한다.

소스코드 - 파이썬

import sys
input = sys.stdin.readline

d = int(input())
cars = map(int, input().split())
answer = 0
for c in cars:
    if c == d:
        answer += 1
print(answer)

소스코드 - C++

#include <cstdio>
using namespace std; 

int main(int argc, char** argv) 
{
    int d, car, i;
    int cnt = 0;
    scanf("%d", &d);
    
    for(i=0; i<5; i++) {
        scanf("%d", &car);
        if (d == car) {
            cnt++;
        }
    }
    printf("%d", cnt);
}

소스코드 - Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int i, cnt = 0;
        for(i=0; i<5; i++) {
            if(n == sc.nextInt()) {
                cnt++;
            }
        }
        System.out.println(cnt);
    }
}

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

 

2446번: 별 찍기 - 9

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

해결방안

1. 각 K번째 줄에 대해 다음과 같은 출력을 정의한다.

2. 1 ~ N-1번째 줄에는 별을 (N-K)*2+1개 출력한다.

3. N번째 줄에는 별을 1개 출력한다.

4. N+1 ~ 2N-1번째 줄에는 별을 (K-N)*2+1개 출력한다.

2. 모든 출력은 2*N-1개의 길이를 갖은 문자열 중앙정렬로 출력한다.

소스코드 - 파이썬

import sys
input = sys.stdin.readline

# k : star, n : max_len
def midStar(k, n):
    blank = " "
    star = "*"
    stars = star * k
    blanks = blank * ((n-k)//2)
    return blanks + stars

def printStars(n):
    l = 2*n-1
    for k in range(1,l+1):
        if k == n:
            s = midStar(1, l)
        elif k < n:
            s = midStar((n-k)*2+1, l)
        elif k > n:
            s = midStar((k-n)*2+1, l)
        print(s)

N = int(input())
printStars(N)

소스코드 - C++

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;

string midStar(int k, int n) {
    string blank = " ";
    string star = "*";
    string stars = "";
    int blank_n = (n-k)/2;
    int star_n = k;
    int i;
    for (i=0; i<blank_n; i++) {
        stars.append(blank);
    }
    for (i=0; i<star_n; i++) {
        stars.append(star);
    }
    return stars;
}

int main() {
    int n, k;
    string s;
    scanf("%d", &n);
    
    int l = 2*n-1;
    for(k=1; k<l+1; k++) {
        if (k == n) {
            s = midStar(1, l);
        } else if (k < n) {
            s = midStar((n-k)*2+1, l);
        } else if (k > n) {
            s = midStar((k-n)*2+1, l);
        }
        cout << s << endl;
    }
}

소스코드 - Java

import java.util.*;

public class Main {
    public static String midStar(int k, int n) {
        String blank = new String(" ");
        String star = new String("*");
        String stars = new String("");
        int blank_n = (n-k)/2;
        int star_n = k;
        int i;
        for (i=0; i<blank_n; i++) {
            stars += blank;
        }
        for (i=0; i<star_n; i++) {
            stars += star;
        }
        return stars;
    }    
    
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int l = 2*n-1;
        int k;
        String s = new String("");
        for (k=1; k<l+1; k++) {
            if (k == n) {
                s = midStar(1, l);
            } else if (k < n) {
                s = midStar((n-k)*2+1, l);
            } else if (k > n) {
                s = midStar((k-n)*2+1, l);
            }
            System.out.println(s);
        }
    }
}

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

 

14681번: 사분면 고르기

문제 흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다. 예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다. 점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표

www.acmicpc.net

문제

흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다.

예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다.

점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표와 y좌표는 모두 양수나 음수라고 가정한다.

입력

첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

출력

점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

해결방안

1. (x > 0 and y > 0) : 1사분면

2. (x < 0 and y > 0) : 2사분면

3. (x < 0 and y < 0) : 3사분면

4. (x > 0 and y < 0) : 4사분면

소스코드 - 파이썬

import sys
input = sys.stdin.readline

def Quadrant(x,y):
    if x > 0:
        if y > 0:
            return 1
        elif y < 0:
            return 4
    elif x < 0:
        if y > 0:
            return 2
        elif y < 0:
            return 3
    return 0

x = int(input())
y = int(input())
q = Quadrant(x,y)
print(q)

소스코드 - C++

#include <cstdio>
using namespace std;

int Quadrant(int x, int y) {
    int q = 0;
    if (x > 0) {
        if (y > 0) {
            q = 1;
        } else if (y < 0) {
            q = 4;
        }
    } else if (x < 0) {
        if (y > 0) {
            q = 2;
        } else if (y < 0) {
            q = 3;
        }
    }
    return q;
}

int main() {
    int x, y, q;
    scanf("%d", &x);
    scanf("%d", &y);
    q = Quadrant(x, y);
    printf("%d", q);
}

소스코드 - Java

import java.util.*;

public class Main {
    public static int Quadrant(int x, int y){
        int q = 0;
        if (x > 0) {
            if (y > 0) {
                q = 1;
            } else if (y < 0) {
                q = 4;
            }
        } else if (x < 0) {
            if (y > 0) {
                q = 2;
            } else if (y < 0) {
                q = 3;
            }
        }
        return q;
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int y = sc.nextInt();
        int q = Quadrant(x,y);
            
        System.out.println(q);
    }
}

https://www.youtube.com/watch?v=chuW-EhWgGI&feature=youtu.be

Wherever You Are - ONE OK ROCK

I'm telling you

I softly whisper

Tonight tonight

You are my angel

愛してるよ
아이시테루요
사랑해

2人は一つに
후타리와 히토츠니
두 사람은 하나로

Tonight tonight
I just say

Wherever you are, I always make you smile

Wherever you are, I'm always by your side

Whatever you say, 君を思う気持ち
Whatever you say, 키미오 오모우키모치
Whatever you say, 너를 생각하는 마음

I promise you"forever"right now
I don't need a reason
I just want you baby
Alright alright
Day after day

この先長いことずっと
코노사키 나가이코토 즛토
앞으로 긴 시간동안

どうかこんな僕とずっと
도우카 콘나보쿠토 즛토
제발 이런 나와 계속

死ぬまで Stay with me
시누마데 Stay with me
죽을 때까지 Stay with me

We carry on…


Wherever you are, I always make you smile

Wherever you are, I'm always by your side

Whatever you say, 君を思う気持ち
Whatever you say, 키미오 오모우키모치
Whatever you say, 널 생각하는 마음

I promise you"forever"right now

Wherever you are, I never make you cry

Wherever you are, I never say goodbye

Whatever you say, 君を思う気持ち
Whatever you say, 키미오 오모우키모치
Whatever you say, 널 생각하는 마음

I promise you"forever"right now

僕らが出逢った日は2人にとって一番目の記念すべき日だね
보쿠라가데앗타히와 후타리니톳테 이치방메노키넨스베키히다네
우리가 만난 날은 둘에게 있어 첫 번째로 기념해야할 날이야

そして今日という日は2人にとって二番目の記念すべき日だね
소시테 쿄토이우히와후타리니톳데 니방메노 키넨스베키히다네
그리고 오늘이란 날은 둘에게 있어 두 번째로 기념해야할 날이야


心から愛せる人
코코로카라 아이세루히토
진심으로 사랑할 수 있는 사람

心から愛しい人
코코로카라 이토시이히토
진심으로 사랑스러운 사람

この僕の愛の真ん中にはいつも君がいるから
코노보쿠노아이노만나카니와 이츠모키미가이루카라
내 사랑의 한가운데엔 언제나 네가 있기에

Wherever you are, I always make you smile

Wherever you are, I'm always by your side

Whatever you say, 君を思う気持ち
Whatever you say, 키미오 오모우키모치
Whatever you say, 널 생각하는 마음

I promise you"forever"right now

Wherever you are

Wherever you are

Wherever you are..

#WhereverYouAre #OneOkRock #JPOP #가사 #歌詞 #lyrics #발음 #해석

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

 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다. 예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다. 노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로

www.acmicpc.net

문제

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 21억 이하의 자연수이다.

출력

첫 번째 줄에 손익분기점 즉 최초로 이익이 발생하는 판매량을 출력한다. 손익분기점이 존재하지 않으면 -1을 출력한다.

해결 방안

1. 손익분기점을 구하기 위한 판매개수를 n으로 두고 수학적으로 접근한다.

생산비용 = A + (B * n) 
판매비용 = C * n 
손익 분기점 = (판매비용 - 생산비용 > 0) 
= (C*n) - (A + (B*n)) > 0 
= (C-B)*n - A > 0 
= n > A / (C-B) 

 

2. 손익 = (C-B)*n - A 에서 A,B,C는 자연수이므로 C-B가 0보다 작거나 같으면 손익은 항상 음수이므로 손익 분기점이 존재하지
않는다.(n = -1)
3. n > A / (C-B) 를 만족하는 n은 math.floor(A/(C-B) + 1)을 이용하여 구할 수 있다. 이는 다음과 같은
코드와 같은 작업을 한다.

if (A % (C-B) == 0): 
n = A//(C-B) + 1 
else: 
n = A//(C-B) + 2 

 

4. 2,3을 코드로 정리하면 다음과 같다.

if C - B <= 0: 
  n = -1 
else: 
  n = math.floor(A/(C-B) + 1) 

소스 코드

import sys, math 
input = sys.stdin.readline 

''' 
cost = A + (B * n) 
sale = C * n 
BreakEventPoint = (sale - cost > 0) 
sale - cost > 0 
 = (C*n) - (A + (B*n)) > 0 
 = (C-B)*n - A > 0 
 = n > A / (C-B) 

if C - B <= 0: 
  n = -1 
else: 
  n = math.floor(A/(C-B) + 1) 

''' 
def BreakEventPoint(A,B,C): 
  if C - B <= 0: 
    n = -1 
  else: 
    n = math.floor(A/(C-B) + 1) 
  return n 

def main(): 
  # input 
  A,B,C = list(map(float, input().split())) 
  n = BreakEventPoint(A,B,C) 
  print(n) 

main() 

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

 

1260번: DFS와 BFS

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

www.acmicpc.net

[알고리즘] 깊이 우선 탐색(DFSDepth First Search) 과 너비 우선 탐색(Breadth First Search)

문제

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

입력

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

출력

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

해결 방안

1. DFS, BFS의 그래프 기본 클래스를 생성한다.
2. self.graph를 collections.defaultdict(list)로 dictionary를 생성하면 self.graph의 새로운 key값을 사용할 때 따로 초기화해주지 않아도 list로 자동 생성해주므로 다음과 같이 소스 코드를 간단히 작성할 수 있다.

self.graph = dict() 
if not key in self.graph: 
  self.graph[key] = [value] 
else: 
  self.graph[key].append(value) 

# collections.defaultdict 사용시 
from collections import defaultdict 
self.graph = defaultdict(list) 
self.graph[key].append(value) # new key의 경우 자동으로 리스트 생성 

 

3. self.node는 결과값으로 방문한 점을 순서대로 표시해줄 리스트
4. addEdge(u, v)함수는 연결되어 있는 정점들을 graph에 저장한다. 입력값의 간선은 양방향이므로 graph[u].append(v), graph[v].append[u] 양방향으로 저장한다.
5. sortEdge()함수는 graph의 각 정점에 연결된 정점들을 순서대로 정렬한다. 이 문제에서 한 정점에 여러개의 정점이 연결되어 있는 경우에 번호가 적은 점부터 방문하기 위해서 필요하다.
6. visited = defaultdict(lambda: False)정점을 방문했는지 확인하기 위해서 필요한 dictionary데이터로 2.설명에 첨언하면 visited[key]가 정의되지 않았을 때 visited[key] == False 값을 확인하는 순간에 visited[key]의 값을 자동으로 False로 초기화해준다. 실제 key를 방문하는 순간에 dictionary 값을 생성하여 확인하기 때문에 메모리 관리가 효율적으로 가능하다.
7. DFS는 DFSUtil 재귀함수를 사용하여 Deep First Search를 구현하고, BFS는 queue를 생성하여 Breadth First Search를 구현한다.

소스 코드

from collections import defaultdict 
import sys 

class GraphDFS: 
  def __init__(self): 
    self.graph = defaultdict(list) 
    self.node = [] 

  def addEdge(self, u, v): 
    self.graph[u].append(v) 
    self.graph[v].append(u) 

  def sortEdge(self): 
    for i in self.graph: 
      self.graph[i] = list(sorted(self.graph[i])) 

  def DFSUtil(self, v, visited): 
    visited[v] = True 
    self.node.append(v) 

    for i in self.graph[v]: 
      if visited[i] == False: 
        self.DFSUtil(i, visited) 

  def DFS(self, s): 
    self.sortEdge() 
    self.node = [] 

    visited = defaultdict(lambda: False) 
    self.DFSUtil(s, visited) 

    return self.node 

class GraphBFS: 
  def __init__(self): 
    self.graph = defaultdict(list) 

  def addEdge(self, u, v): 
    self.graph[u].append(v) 
    self.graph[v].append(u) 

  def sortEdge(self): 
    for i in self.graph: 
      self.graph[i] = list(sorted(self.graph[i])) 

  def BFS(self, s): 
    self.sortEdge() 
    self.node = [] 

    visited = defaultdict(lambda: False) 
    queue = [] 
    queue.append(s) 
    visited[s] = True 

    while queue: 
      s = queue.pop(0) 
      self.node.append(s) 

      for i in self.graph[s]: 
        if visited[i] == False: 
          queue.append(i) 
          visited[i] = True 

    return self.node 

def main(): 
  input = sys.stdin.readline 
  dfs = GraphDFS() 
  bfs = GraphBFS() 

  N, M, V = list(map(int, input().split())) 
  for m in range(M): 
    x, y = list(map(int, input().split())) 
    dfs.addEdge(x,y) 
    bfs.addEdge(x,y) 

  dfs_node = dfs.DFS(V) 
  bfs_node = bfs.BFS(V) 

  print(' '.join(list(map(str, dfs_node)))) 
  print(' '.join(list(map(str, bfs_node)))) 

main() 

 

+ Recent posts