DFS Depth-First Search

깊이 우선 탐색
그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘

그래프 기본 구조

  • 노드(node) 간선(edge)로 구성그래프 탐색

  • 하나의 노드를 시작으로 다수의 노드를 방문하는 것

  • 두 노드가 간선으로 연결되어 있다면 두 노드는 인접하다고 표현그래프 표현

  • 인접행렬

    • 2차원 배열로 그래프의 연결 관계를 표현하는 방식

    • 연결되어 있지 않은 노드끼리는 무한의 비용으로 작성

      INF = 99999999999 # 무한의 비용 선언
      graph = [
        [0,7,5],
        [7,0,INF],
        [5,INF,0]
      ]
  • 인접 리스트

    • 리스트로 그래프의 연결 관계를 표현하는 방식

    • 모든 노드에 연결된 노드에 대한 정보를 차례대로 연결하여 저장

      #행(row)이 3개인 2차원 리스트로 인접 리스트 표현
      graph =[[] for _ in range(3)]
      #노드 0에 연결된 노드 정보 저장 (노드,거리)
      graph[0].append((1,7))
      graph[0].append((2,5))
      #노드 1에 연결된 노드 정보 저장 (노드,거리)
      graph[1].append((0,7))
      #노드 2에 연결된 노드 정보 저장 (노드,거리)
      graph[2].append((0,5))

DFS 알고리즘

특정한 경로로 탐색하다가 특정한 상황에서 최대한 깊숙이 들어가서 노드를 방문한 후 다시 돌아가 다른 경로로 탐색하는 알고리즘

동작 과정

  1. 탐색 시작 노드를 스택에 삽입하고 방문 처리
  2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
  3. 1,2번의 과정을 더 이상 수행할 수 없을 때까지 반복

예시

  • 노드 1을 시작 노드로 설정하여 DFS를 이용해 탐색 진행인접한 노드 중에서 방문하지 않은 노드가 여러 개 있으면 번호가 낮은 순서부터 처리

1.시작 노드인 1을 스택에 삽입하고 방문 처리
2.노드 1에 인접 노드 2,3,8이 있다. 이 중 가장 작은 노드인 2를 스택 삽입
3.노드 2의 인접 노드 7 스택 삽입
4.노드 7의 인접 노드 8,6 중 작은 노드인 6 스택 삽입
5.노드 6의 인접 노드가 없으므로 스택에서 노드 6을 꺼냄
6.노드 7에서 방문하지 않은 인접 노드 8을 스택에 삽입
7.노드 8의 인접 노드가 없으므로 노드 8을 스택에서 꺼냄
8.노드 7의 인접 노드가 없으므로 노드 7을 스택에서 꺼냄
9.위와 동일 노드 2 꺼냄
10.노드 1의 인접 노드 3을 스택에 삽입
11.노드 3의 인접 노드 4,5 중 작은 4를 스택에 삽입
12.노드 4의 인접노드가 없으므로 노드 4를 스택에서 꺼냄
13.노드 3의 인접 노드 5를 스택에 삽입
14. 남아 있는 노드에 방문하지 않은 인접 노드가 없다. 따라서 모든 노드를 차래대로 꺼낸다.

결과 : 노드의 탐색 순서(스택에 들어간 순서)

1 -> 2 -> 7 -> 6 -> 8 -> 3 -> 4 -> 5

구현

#DFS 메서드 정의
def dfs(graph, v, visited):
        # 현재 노드를 방문 처리
        visited[v] = True
        print(v end=' ')
        # 현재 노드와 연결된 다른 노드를 재귀적으로 방문
        for i in graph[v]:
            if not visited[i]:
                dfs(graph, i, visited)
# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]
# 각 노드가 방문된 정보를 리스트 자료형으로 표현 (1차원 리스트)
visited = [False] * 9

# 정의된 DFS 함수 호출
dfs(graph, 1, visited)
# 결과
# 1 2 7 6 8 3 4 5



BFS Breadth First Search

너비 우선 탐색

가까운 노드부터 탐색하는 알고리즘

인접한 노드를 반복적으로 큐에 넣도록 알고리즘을 작성하면 자연스럽게 먼저 들어온 것이 먼저 나가게 되어 가까운 노드부터 탐색을 진행하게 된다.

동작과정

  1. 탐색 시작 노드를 큐에 삽입하고 방문 처리
  2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
  3. 1,2의 과정을 반복

예시

  1. 시작 노드인 1을 큐에 삽입하고 방문처리
  2. 큐에서 노드 1을 꺼내고 방문하지 않은 인접 노드 2, 3, 8을 모두 큐에 삽입하고 방문 처리
  3. 큐에서 노드 2를 꺼내고 방문하지 않은 인접 노드 7을 큐에 삽입하고 방문 처리
  4. 큐에서 노드 3을 꺼내고 방문하지 않은 인접 노드 4, 5를 모두 큐에 삽입하고 방문 처리
  5. 큐에서 노드 8을 꺼내고 방문하지 않은 인접 노드가 없으므로 무시
  6. 큐에서 노드 7을 꺼내고 방문하지 않은 인접 노드 6을 큐에 삽입하고 방문 처리
  7. 남아 있는 노드에 방문하지 않은 인접 노드가 없으므로 모든 노드를 차례대로 꺼냄

    결과 : 노드의 탐색 순서(큐에 들어간 순서)

    1 -> 2 -> 3 -> 8 -> 7 -> 4 -> 5 -> 6

구현

from collections import deque
# BFS 메서드 정의
def bfs(graph, start, visited):
    # 큐 구현을 위해 deque 라이브러리 사용
    queue = deque([start])
    # 현재 노드를 방문 처리
    visited[start] = True
    # 큐가 빌 때까지 반복
    while queue:
        # 큐에서 하나의 원소를 뽑아 출력
        v = queue.popleft()
        print(v, end=' ')
        # 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

# 각 노드가 연결된 정보를 리스트 자료형으로 표현 (2차원 리스트)
graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

# 각 ㄴ드가 방문된 정보를 리스트 자료형으로 표현 (1차원 리스트)
visited = [False] * 9

# 정의된 BFS 함수 호출
bfs(graph, 1, visited)

# 결과
# 1 2 3 8 7 4 5 6

정리

DFS BFS
동작 원리 스택
구현 방법 재귀함수 이용 큐 자료구조 이용

참고

이것이 취업을 위한 코딩 테스트다 with 파이썬
저자 : 나동빈

728x90

'Algorithm > 기초 개념' 카테고리의 다른 글

자료 구조 - 스택,큐,재귀함수  (0) 2021.04.12

자료 구조 기초

탐색

  • 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정

자료구조

  • 데이터를 표현하고 관리하고 처리하기 위한 구조



스택 Stack

선입후출 or 후입선출 구조

  • 아래에서부터 위로 차곡차곡 쌓기
  • 아래 박스 치우기위해서는 위의 박스 먼저 치워야함

파이썬

  • append()
    • 리스트의 가장 뒤쪽에 데이터 삽입
  • pop()
    • 리스트의 가장 뒤쪽에서 데이터를 꺼내기

      예제

      #스택 선언
      stack = []
      #스택에 5 추가
      stack.append(5)
      #스택에 가장 최근에 추가된 항목 삭제
      stack.pop()


      큐 Queue

선입선출 구조

  • 대기 줄에 비유
    • 먼저 온 사람이 먼저 들어가고 나중에 온 사람이 나중에 들어감

      라이브러리 사용하기

  • collections 의 deque

    from collections import deque

    예제

    from collections import deque
    

#Queue 구현을 위해 deque 라이브러리 사용
queue = deque()
#삽입
queue.append(5)
#삭제 (먼저 삽입된 자료부터 삭제)
queue.popleft()

#먼저 삽입된 순서대로 출력
print(queue)
#다음 출력을 위해 역순으로 바꾸기
queue.reverse()
#나중에 들어온 원소부터 출력
print(queue)
#리스트 자료형으로 변환
list(queue)

<br/><br/>
# 재귀함수
> 자기자신을 다시 호출하는 함수
### 예시
```Python
def recursive_function():
    print('재귀함수를 호출합니다.')
    recursive_function()

recursive_function()

주의사항

  • 재귀 함수가 언제 끝날지 종료 조건을 꼭 명시

참고

  • 재귀 함수는 내부적으로 스택 자료 구조와 동일

팩토리얼을 통한 반복문과 재귀함수 비교

# 반복문
def factorial_iterative(n):
    result = 1
    # 1부터 n까지의 수를 차례대로 곱하기
    for i in range(1, n+1):
        result *= i
    return result

# 재귀적으로 구현
def factorial_recursive(n):
    # n이 1 이하인 경우 1을 반환
    if n <= 1:
        return 1
    # n! = n * (n-1)!를 그대로 코드로 작성
    return n * factorial_recursive(n-1)

참고

이것이 취업을 위한 코딩 테스트다 with 파이썬
저자 : 나동빈

728x90

'Algorithm > 기초 개념' 카테고리의 다른 글

탐색 알고리즘 - DFS, BFS  (0) 2021.04.12

[게임 개발]

<문제>

현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다. 캐릭터가 있는 장소는 1 X 1 크기의 정사각형으로 이뤄진 N X M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. 캐릭터는 동서남북 중 한 곳을 바라본다.

맵의 각 칸은 (A, B)로 나타낼 수 있고, A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다. 캐릭터의 움직임을 설정하기 위해 정해 놓은 매뉴얼은 이러하다.

  1. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 방향으로 90도 회전한 방향)부터 차례대로 갈 곳을 정한다.

  2. 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재한다면, 왼쪽 방향으로 횐전한 다음 왼쪽으로 한 칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행하고 1단계로 돌아간다.

  3. 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단, 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.

현민이는 위 과정을 반복적으로 수행하면서 캐릭터의 움직임에 이상이 있는지 테스트하려고 한다. 메뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는 프로그램을 만드시오.

<입력 조건>

첫째 줄에 맵의 세로 크기 N과 가로 크기 M을 공백으로 구분하여 입력한다. (3 <= N, M <= 50)

둘째 줄에 게임 캐릭터가 있는 칸의 좌표 (A, B)와 바라보는 방햔 d가 각각 서로 공백으로 구분하여 주어진다. 방향 d의 값으로는 다음과 같이 4가지가 존재한다.

  • 0 : 북쪽
  • 1 : 동쪽
  • 2 : 남쪽
  • 3 : 서쪽

셋째 줄부터 맵이 육지인지 바다인지에 대한 정보가 주어진다. N개의 줄에 맵의 상태가 북쪽부터 남쪽 순서대로, 각 줄의 데이터는 서쪽부터 동쪽 순서대로 주어진다. 맵의 외각은 항상 바다로 되어 있다.

  • 0 : 육지
  • 1 : 바다

처음에 게임 캐릭터가 위치한 칸의 상태는 항상 육지이다.

<출력 조건>

첫째 줄에 이동을 마친 후 캐릭터가 방문한 칸의 수를 출력한다.

<입력 예시>

4 4
1 1 0 // (1, 1)에 북쪽(0)을 바라보고 서 있는 캐릭터
1 1 1 1
1 0 0 1
1 1 0 1
1 1 1 1

<출력 예시>

3

핵심 아이디어

전형적인 시뮬레이션 문제
방향을 설정해서 이동하는 문제는 dx,dy 라는 별도의 리스트를 만들어 방향을 정하는 것이 효과적

현재 캐릭터가 북쪽을 바라보고 있을 때 북쪽으로 이동하기 위해서 현재의 좌표에서 (-1,0)만큼 이동시키는 것이다.
결과 남,북은 x좌표 +1,-1 동,서는 y좌표 +1,-1로 움직인다.
리스트 컴프리헨션 문법을 사용해 2차원 리스트 초기화 (파이썬에서 2차원 리스트 선언할때 효과적)

PseudoCode

  1. 우선 맵을 담을 map[][]과 그 각 칸을 들렸는지의 여부를 체크할 visit[][]을 만들자
  2. 캐릭터가 바라보는 방향 각각의 움직임을 셋팅하자

풀이

# n, m
n, m = map(int, input().split())

# 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [[0] * m for _ in range(n)]

# 현재 캐릭터의 x,y 좌표 방향 d
x, y, direction = map(int, input().split())

# 현재 좌표 방문처리
d[x][y] = 1

# 전체 맵 정보
array = []
for i in range(n):
    array.append(list(map(int, input().split())))

# 북, 동, 남, 서 방향 정의
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 왼쪽으로 회전
def turn_left():
    global direction
    direction -= 1
    if direction == -1:
        direction = 3


# 시뮬레이션 시작
count = 1
turn_time = 0
while True:
    # 왼쪽으로 회전
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]

    # 회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1
        x = nx
        y = ny
        count += 1
        turn_time = 0
        continue
    # 회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
    else:
        turn_time += 1
    # 4방향 모두 갈 수 없는 경우
    if turn_time == 4:
        nx = x - dx[direction]
        ny = y - dy[direction]
        # 뒤로 갈 수 있다면 이동
        if array[nx][ny] == 0:
            x = nx
            y = ny
        # 뒤가 바다로 막혀 있는 경우
        else:
            break
        turn_time = 0
print(count)

출저

이것이 취업을 위한 코딩 테스트다 with 파이썬
저자 : 나동빈

728x90

'Algorithm > 구현' 카테고리의 다른 글

왕실의 나이트 - Python  (0) 2021.04.12

[왕실의 나이트]

<문제>

행복 왕국의 왕실 정원은 체스판과 같은 8 X 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다.

나이트는 말을 타고 있기 때문에 이동을 할 때에는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다. 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.

  1. 수평으로 두 간 이동한 뒤에 수직으로 한 칸 이동하기
  2. 수직으로 두 간 이동한 뒤에 수평으로 한 칸 이동하기

이처럼 8 X 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오. 이때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현한다.

예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음과 같은 2가지이다. a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다.

  1. 오른쪽으로는 두 칸 이동 후 아래로 한 칸 이동하기 (c2)
  2. 아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기 (b3)
    또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 경우의 수는 6가지이다. 이건 직접 계산해보시오.

<입력 조건>

첫째 줄에 8 X 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입련된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.

<출력 조건>

첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

<입력예시>

a1

<출력예시>

2

핵심아이디어

단순히 행과 열이 나이트가 이동할 수 있는 8가지의 경우의 수에 대해서 체스판을 벗어나는지 아닌지만 체크

PseudoCode

  1. 나이트의 현재 위치를 행과 열로 나누어 잡고.
  2. 나이트가 이동할 수 있는 8가지 경우의 수를 시도해보고
    체스판을 벗어나지 않는 경우의 수를 출력한다.

풀이

location = input()
row = int(location[1])
# a를 좌표 1로 변경
col = int(ord(location[0])) - int(ord('a')) + 1

# 나이트가 이동할 수 있는 8가지 방향 정의
dx = [-2, -1, 1, 2, 2, 1, -1, -2]
dy = [-1, -2, -2, -1, 1, 2, 2, 1]

# 8가지 방향에 대하여 이동가능한지 확인
result = 0
for i in range(0, 8):
    next_row = row + dx[i]
    next_col = col + dy[i]
    # 이동 가능할때 카운트 증가(행과 열이 1~8사이에 존재해야함)
    if next_row >= 1 and next_row <= 8 and next_col >= 1 and next_col <= 8:
        result += 1

print(result)

# 다른 풀이법
# 나이트가 이동할 수 있는 8가지 방향 묶어서 정의
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
result2 = 0
for step in steps:
    next_row = row + step[0]
    next_col = col + step[1]
    if next_row >= 1 and next_row <= 8 and next_col >= 1 and next_col <= 8:
        result2 += 1

print(result2)

참고

ord() 함수
특정한 한 문자를 ASCII코드 값으로 바꿔주는 함수

해석

col = int(ord(location[0])) - int(ord('a')) + 1
열 위치를 표현할 때는 a부터 h로 표현하기 때문에 a의 ASCII코드 값을 빼고 1을 더해주면 1~8까지의 숫자로 변환

출저

이것이 취업을 위한 코딩 테스트다 with 파이썬
저자 : 나동빈

728x90

'Algorithm > 구현' 카테고리의 다른 글

게임 개발 - Python  (0) 2021.04.12

큰 수의 법칙

<문제>

동빈이의 큰수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰수를 만드는 방법이다. 단, 배열의 특정한 인덱스에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다.

예를 들어 순서대로 2, 4, 5, 4, 6으로 이루어진 배열이 있을 때, M이 8이고 K가 3이라고 가정하자.

이 경우 특정한 인덱스의 수가 연속해서 세 번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 + 6 + 5인 46이 된다. 단, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주한다.

예를 들어 순서대로 3, 4, 3, 4, 3으로 이루어진 배열이 있을 때 M이 7이고 K가 2라고 가정하자. 이 경우 두 번째 원소에 해당하는 4와 네 번째 원소에 해당하는 4를 번갈아 두 번씩 더하는 것이 가능하다.

결과적으로 4 + 4 + 4 + 4 + 4 + 4 + 4 인 28이 도출된다.
배열의 크기 N, 숫자가 더해지는 횟수 M, 그리고 K가 주어질 때 동빈이의 큰 수의 법칙에 따른 결과를 출력하시오.

<입력 조건>

첫째 줄에 N(2 <= N <= 1000), M(1 <= M <= 10000), K(1 <= K <= 10000) 의 자연수가 주어지며 각자연수는 공백으로 구분한다.

둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다.
단, 각각의 자연수는 1 이상 10000 이하의 수로 주어진다.
입력으로 주어지는 K는 항상 M보다 작거나 같다.

<출력 조건>

첫째 줄에 동빈이의 큰수의 법칙에 따라 더해진 답을 출력한다.

<입력 예시>

  • 5 8 3
  • 2 4 5 4 6

<출력 예시>

  • 46

PseudoCode

  1. 수를 입력 받아 배열에 저장
  2. 배열을 정렬하여 가장 큰 수와 두번째로 큰 수 찾기
  3. 제일 큰 수를 k 번 더하고 두번 째로 큰 수 한번 더하기 반복
  4. 더해지는 횟수에서 반복횟수를 나눈 나머지만큼 가장 큰 수를 더하기

풀이

# 배열의 크기, 숫자가 더해지는 횟수, 최대 연속되는 횟수
n, m, k = map(int, input().split())

# 배열 입력받기
data = list(map(int, input().split()))
# 배열 정렬 (작은 수 부터 큰 수)
data.sort()

# 가장큰수
first = data[n-1]

# 두번째로 큰 수
second = data[n-2]

# 반복되는 배열의 수
count = m/(k+1)

# 나머지
remainder = m % (k+1)

# 반복되는 수의 합
result = count*((first*k)+second)

# 나머지 합
if(remainder != 0):
    result += remainder*first

# 결과
print(result)

출처

이것이 취업을 위한 코딩 테스트다 with 파이썬
저자 : 나동빈

728x90

'Algorithm > Greedy' 카테고리의 다른 글

문자열 뒤집기 - python  (0) 2021.04.21
곱하기 혹은 더하기 - python  (0) 2021.04.21
모험가 길드 - python  (0) 2021.04.20
숫자 카드 게임 - Python  (0) 2021.04.12
1이 될 때까지 - python  (0) 2021.04.12

숫자 카드 게임

<문제>

숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다. 단, 게임의 룰을 지키며 카드를 뽑아야 하고 룰은 다음과 같다.

  1. 숫자가 쓰인 카드들이 N x M 형태로 놓여 있다. 이때 N은 행의 개수를 의미하며, M은 열의 개수를 의미한다.
  2. 먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
  3. 그다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다.
  4. 따라서 처음에 카드를 골라낼 행을 선택할 때, 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑를 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다.

카드들이 N x M 형태로 놓여 있을 때, 게임의 룰에 맞게 카드를 뽑는 프로그램을 만드시오.

<입력 조건>

  • 첫째 줄에 숫자 카드들이 놓인 행의 개수 N과 열의 개수 M이 공백을 기준으로 하여 각각 자연수로 주어진다. (1 <= N, M <= 100)

  • 둘째 줄부터 N개의 줄에 걸쳐 각 카드에 적힌 숫자가 주어진다. 각 숫자는 1 이상 10,000 이하의 자연수이다.

<출력 조건>

  • 첫째 줄에 게임의 룰에 맞게 선택한 카드에 적힌 숫자를 출력한다.

<입력 예시>      <출력 예시>

3 3                          2
3 1 2
4 1 4
2 2 2


2 4                          3
7 3 1 8
3 3 3 4


핵심 아이디어

각 행마다 가장 작은 수를 찾은 뒤에 그 수 중에서 가장 큰 수

PseudoCode

  1. 숫자를 한 줄씩 입력 받아 가장 작은 수를 구해 배열에 입력
  2. 1의 방식을 n번 반복
  3. 배열에 입력 받은 수를 정렬하여 가장 큰 수 출력

풀이

# n, m 공백으로 구분하여 입력 받기
n, m = map(int, input().split())

# 초기화
result = 0
for i in range(n):
    data = list(map(int, input().split()))
    # 입력 받은 수 중 가장 작은 수
    min_value = min(data)
    # 가장 작은 수 중에서 가장 큰 수
    result = max(result, min_value)

print(result)

출저

이것이 취업을 위한 코딩 테스트다 with 파이썬
저자 : 나동빈

728x90

'Algorithm > Greedy' 카테고리의 다른 글

문자열 뒤집기 - python  (0) 2021.04.21
곱하기 혹은 더하기 - python  (0) 2021.04.21
모험가 길드 - python  (0) 2021.04.20
큰 수의 법칙 - Python  (0) 2021.04.12
1이 될 때까지 - python  (0) 2021.04.12

+ Recent posts