본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

파이썬 백준 알고리즘 풀기

by 머킹 2024. 9. 2.
728x90

[백준 15552, 25314] 코딩은 체육과목 입니다, 빠른 A+B

 

25314번. 코딩은 체육과목 입니다

문제

 

오늘은 혜아의 면접 날이다. 면접 준비를 열심히 해서 앞선 질문들을 잘 대답한 혜아는 이제 마지막으로 칠판에 직접 코딩하는 문제를 받았다. 혜아가 받은 문제는 두 수를 더하는 문제였다. C++ 책을 열심히 읽었던 혜아는 간단히 두 수를 더하는 코드를 칠판에 적었다. 코드를 본 면접관은 다음 질문을 했다. “만약, 입출력이 N바이트 크기의 정수라면 프로그램을 어떻게 구현해야 할까요?”

혜아는 책에 있는 정수 자료형과 관련된 내용을 기억해 냈다. 책에는 long int 4바이트 정수까지 저장할 수 있는 정수 자료형이고 long long int 8바이트 정수까지 저장할 수 있는 정수 자료형이라고 적혀 있었다. 혜아는 이런 생각이 들었다. “int 앞에 long을 하나씩 더 붙일 때마다 4바이트씩 저장할 수 있는 공간이 늘어나는 걸까? 분명 long long long int 12바이트, long long long long int 16바이트까지 저장할 수 있는 정수 자료형일 거야!” 그렇게 혜아는 당황하는 면접관의 얼굴을 뒤로한 채 칠판에 정수 자료형을 써 내려가기 시작했다.

혜아가 N바이트 정수까지 저장할 수 있다고 생각해서 칠판에 쓴 정수 자료형의 이름은 무엇일까?

 

입력

 

첫 번째 줄에는 문제의 정수 N이 주어진다.

 

출력

 

혜아가 N바이트 정수까지 저장할 수 있다고 생각하는 정수 자료형의 이름을 출력하여라.

 

n = int(input())
answer = 'int'
for i in range(n//4):
    answer = 'long ' + answer
print(answer)

 


15552번. 빠른 A+B

 

문제

 

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

 

입력

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

 

출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

 

import sys

T = int(sys.stdin.readline())

for i in range(T):
    A,B = map(int,sys.stdin.readline().split())
    print(A+B)

 

 

 

sys.stdin.readline 설명

 

늘 보던건데 갑자기 이렇게 문제로 나오니까 궁금해졌다!

 

input()과 sys.stdin.readline()은 모두 Python에서 사용자로부터 입력을 받을 때 사용하는 함수입니다.

하지만 이 두 함수는 작동 방식과 사용 시 주의해야 할 점에서 차이가 있습니다.

1. input():

  • 설명: input() 함수는 한 줄의 입력을 받고, 그 입력을 문자열로 반환합니다. 입력 후에는 줄 바꿈(Enter)을 기다립니다.
  • 사용 예시:
    user_input = input()
  • 특징:
    • 사용하기 쉽고, 간단한 입력을 받을 때 많이 사용됩니다.
    • 입력을 받을 때마다 문자열의 앞뒤 공백(특히 줄 바꿈)을 자동으로 제거합니다.

2. sys.stdin.readline():

  • 설명: sys.stdin.readline() 함수는 표준 입력으로부터 한 줄을 읽고, 그 줄을 문자열로 반환합니다. 이때, 줄 끝에 있는 줄 바꿈 문자(\n)도 함께 반환됩니다.
  • 사용 예시:
    import sys user_input = sys.stdin.readline()
  • 특징:
    • 줄 바꿈 문자(\n)가 포함되어 반환되므로, 필요시 이를 제거해야 합니다 (strip() 메서드를 사용해서 제거).
    • 대량의 데이터를 입력받을 때 속도가 더 빠릅니다. 그래서 많은 줄의 데이터를 처리하는 경우에 유용합니다.

 

차이점 요약:

  1. 속도:
    • input()은 상대적으로 느립니다.
    • sys.stdin.readline()은 대량의 데이터를 처리할 때 더 빠릅니다.
  2. 줄 바꿈 처리:
    • input()은 입력받은 문자열의 끝에 줄 바꿈 문자를 제거해 줍니다.
    • sys.stdin.readline()은 줄 바꿈 문자를 제거하지 않으므로, 필요시 직접 제거해야 합니다.
  3. 사용 상황:
    • input()은 간단한 사용자 입력이나 몇 줄의 입력을 받을 때 사용하기 적합합니다.
    • sys.stdin.readline()은 많은 양의 입력을 빠르게 처리해야 할 때 유리합니다.