개요

프로그래머스의 경우 직접 입출력을 받을 필요 없이 함수 형태로 문제를 주고 데이터는 알아서 대입되는 방식이지만 백준의 경우는 직접 입출력을 받아야한다. 이번 기회에 정리해보려한다.

들어가기에 앞서

백준같은 경우는 코드에 문제가 있어도 어디에 문제가 있는지 알기 힘든 경우가 있다. 테스트로는 좋지만 한문제씩 풀어가며 공부하기에는 불편하다.

그래서 코드를 작성하고 테스트를 해볼 수 있으면 좋은데 방법은 여러가지가 있다. IDE를 사용하여 테스트해보는 방법도 있고 온라인 IDE를 사용하여 테스트해보는 방법도 있다.

파이썬 온라인 IDE로 대표적인 것이 바로 리플릿이다. 깔끔한 UI를 제공하고 자동완성과 실시간으로 틀린 문법을 알려준다.
실제 알고리즘 대회에서 이 사이트를 사용하는 경우도 많다고 한다.
리플릿 바로가기

12.4 수정
리플릿 사용 시간이 일정 시간이 넘어가면 유로 결제를 해야하는 듯 보인다. 다른 온라인 컴파일러를 알아봤는데 그 중에서 가장 괜찮은 건
마이 컴파일러 였다.
입력할 때 백준에서 제공하는 값을 복사해서 그대로 넣어주고 사용하면 편하게 사용할 수 있었다.

입력 받기

파이썬에서 입력을 받는 함수는 input함수로 아래와 같이 사용한다.

n = input()

만약 데이터가 정수라면 이를 정수형으로 변환해주어야한다.

n = int(input())

일반적인 알고리즘 사이트 문제라면 입력값이 여러 개인 경우는 띄어쓰기로 구분되는 경우가 많다.

예를 들면 다음과 같다.

1 10 12 3 2

이럴 경우 메소드 체이닝 방식으로 아래와 같이 사용하면 된다.

input().split()

리턴 타입은 리스트다.

만약 위와 같이 입력받은 데이터를 잘라서 사용하는데 정수로 사용해야한다면 map과 list 함수를 사용해야한다.

두 개의 경우

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

여러개인 경우

list(map(int, input.split()))

위의 코드는 다음과 같은 순서로 동작한다.

  • input으로 받는다.
  • 받은 데이터를 split()으로 쪼갠다.
  • map 함수를 이용하여 리스트의 모든 원소에 int()함수를 적용하여 정수형으로 바꾼다.
  • 이렇게 처리된 결과를 list로 바꾼다.

기본적인 작성법은 이렇다. 그러나 데이터가 많아서 입력을 받는 속도가 중요할 때가 있다.

그러면 파이썬의 sys 라이브러리를 사용해야한다.

import sys
input = sys.stdin.readline

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

정렬

정렬되지 않은 데이터가 주어진다면 이를 적절히 정렬하여 사용하는 것이 좋다.
이 때 사용할 수 있는 함수는 sort()함수다.
sort함수는 기본적으로 데이터를 오름차순으로 정렬하고 다음과 같이 사용한다.

data.sort()

이렇게 정렬하고 가장 큰 수를 찾으려면 data[n-1]과 같이 접근하면 가장 큰 수가 나온다.
만약 내림차순으로 정렬하고 싶다면 함수에 인자를 추가해주어야한다.

# 파이썬에선 불리언 타입을 True, False와 같이 대문자로 작성한다는 것을 기억하자
data.sort(reverse = True)

그래프 저장

프로그래밍을 처음 접했을 때 많이들 헷갈려하는 부분이 바로 컴퓨터는 0부터 숫자를 센다는 것이다.
리스트의 첫번째 값을 받아오려면 1이 아니라 0을 사용해야한다.

그래프를 다룰 때도 마찬가지로 헷갈릴 때가 있다.
따라서 일종의 트릭을 사용한다. 바로 문제에서 주어지는 데이터 개수보다 1만큼 크게 설정하고 1번째 인덱스부터 데이터를 채워넣는 것이다.
코드로 나타내보면 다음과 같다.

arr = [[]for _ in range(n+1)]

이는 리스트 컴프리헨션을 이용하여 2차원 리스트를 나타낸 것이다.
_라는 기호는 별 의미는 없고 인덱스나 실제 데이터가 중요한 경우 i와 같이 사용하지만 이렇게 비어있는 구조를 만들 때 언더바를 사용한다.
이렇게 하면 아래와 같이 비어있는 2차원 리스트가 생성된다.

[[], [], []...]