1. 10807
문제
총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.
출력
첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.

n = int(input())
n_list = list(map(int, input().split()))
v = int(input())
print(n_list.count(v))
코드 설명
첫째 줄에 정수의 개수 n을 input으로 입력받고 int 정수형으로 변환한다.
둘째 줄에 공백으로 구분된 n개의 정수를 리스트 형태의 n_list로 입력받는다.
셋째 줄에 찾으려고 하는 정수 v를 n과 같은 코드로 입력받는다.
count 메서드를 사용해 n_list 안의 v 갯수를 세서 print 함수로 출력한다.
n_list를 n개만큼의 인수를 가진 리스트만 입력받는 조건문이 필요하다고 생각했다. 그런데 조건을 걸지 않아도 시스템이 자동으로 n개로 이루어진 리스트만 입력받는다. 백준 시스템과 관련이 있는 것 같다. 마찬가지로 n(1 <= n <= 100) 도 따로 조건을 지정해주지 않아도 실행이 되고 정답으로 인정된다.
10807번 문제에 대한 의견과 조건문이 포함된 코드는 아래 링크에서 확인할 수 있다.
https://www.acmicpc.net/board/view/110400
import sys
n = int(sys.stdin.readline())
n_list = list(map(int, sys.stdin.readline()))
v = int(sys.stdin.readline())
print(n_list.count(v))
파이썬의 input() 함수는 실행 시간이 오래 걸린다는 단점이 있다. sys를 import 해서 input() 부분만 수정해봤다.

4ms지만 실행 시간이 개선되었다.
2. 10871
문제
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
출력
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

import sys
n, x = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
for i in a:
if i < x:
print(i, end=' ')
코드 설명
입력 조건에 제시된 대로 첫째 줄에 n과 x를 입력받았다. sys.stdin.readline() 사용에 익숙해지고자 input 대신 사용했다. 10807번과 마찬가지로 백준 시스템 상 길이가 n인 리스트를 입력받을 필요가 없다. 둘째 줄에 sys.stdin.readline을 사용하고 공백을 기준으로 split, map 함수로 int 변환한 다음 리스트 객체로 변환해 a에 저장했다. 정해진 개수의 정수를 한 줄에 입력받고 공백을 기준으로 split할 것이므로 strip 공백 제거가 필요하지 않다.
for 반복문으로 리스트 a 안의 인자를 i에 하나씩 가져왔다. i가 x보다 작으면 출력하고, 정수들이 공백으로 구분되도록 end=' '를 추가했다.
import sys
n, x = map(int, input().split())
a = list(map(int, input().split()))
for i in a:
if i < x:
print(i, end=' ')
input() 함수로 n, x, a를 입력받는 코드는 위와 같다. sys.stdin을 사용했을 때와 시간 차이가 발생하지는 않았다. 하지만 실제 코딩 테스트에서는 처리 시간을 기준으로 input은 오답, sys.stdin.readline은 정답 처리되는 경우도 있으니 잘 알아두면 좋다.
에러 코드
import sys
n, x = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
for i in range(a):
if i < x:
print(i, end=' ')
위는 런타임 에러가 난 코드이다. 에러가 나는 이유를 찾으려고 정답 코드와 이 코드를 같이 띄워두고 한참 생각했다. 해결하고 보니 어이없을 정도로 간단한 실수였다.
import sys
n, x = map(int, input().split())
a = list(map(int, input.split()))
for i in range(n):
if a[i] < x:
print(a[i], end=' ')
이 에러는 참고한 코드를 수정하는 과정에서 발생한 실수였다.
처음 10807번을 풀 때 접근 방법을 모르겠어서 다른 코드를 참고했다.
input을 sys.stdin.readline()으로 바꾸고, for문에서 i를 가져오는 조건을 수정하던 중 range(n)을 range(a)로 두고 코드를 실행했다. 그리고 내가 sys.stdin.readline()를 잘 몰라서, 이 함수가 다르게 작동하는 어떤 조건이 있는지 계속 고민했다. 코드가 완전히 똑같은데 왜 오류가 날까? 라는 의문에 다다라서야 for문에서 문제를 찾아야 한다는 생각이 들었다.
참고했던 코드는 i를 리스트 a에서 하나씩 가져오는 것이 아니라 리스트 길이인 n만큼 i를 반복해서 가져오고, a[i]로 리스트 속의 인자를 가져온다. n번 반복하면서 a[i]로 리스트에 접근할 이유가 없다고 생각해서 리스트 a에 바로 접근하게 코드를 수정하려 했는데 그 과정에서 놓쳐버렸다. 그렇지만 덕분에 에러를 해결해볼 수 있었다.
백준 문제를 단계별로 차근차근 풀고 있다. 백준허브를 연결해서 문제를 하나 풀면 깃허브 커밋 칸이 연두색으로 하나 색칠되는 것을 나름의 보상으로 삼았다. 매일 한 문제라도 풀면 1일 1커밋이 된다고 되새기며 집에 가면 눕고만 싶은 나를 달래고 있다.
코딩 테스트 준비를 하기 전, 실제 출제되는 유형의 코딩테스트를 경험해봤다. 코드를 단 한 줄도 작성할 수 없어서 큰 충격을 받았다. 입출력, 반복문, 조건문부터 차근차근 풀어오면서 이렇게 해서 어느 세월에 코딩 테스트에 출제되는 수준의 문제를 풀 수 있을까? 라는 막막함도 솔직히 있었다. 문제를 풀기 시작한 지 2주만에 드디어 배열 단계에 입성했다. 말로 표현하기 어려울 정도로 감격스럽다. 배열이라니!
이대로 계속 공부해나가면 큐, 스택과 같은 들어보기만 했던 문제도, 나에게 충격을 줬던 여러 개념이 혼합된 문제도 풀게 될 거다. 이런 생각을 할 수 있다는 게 깃허브 커밋보다 더 큰 보상같다.
'코딩 테스트' 카테고리의 다른 글
백준 2750 파이썬 정렬 풀이 (0) | 2024.04.02 |
---|---|
백준 10818, 2562 파이썬 1차원 배열 풀이 (0) | 2024.04.01 |
백준 25304, 25314 풀이 파이썬 반복문 (0) | 2024.03.25 |
백준 10950, 8393 풀이 파이썬 반복문 (0) | 2024.03.21 |
백준 2480 풀이 파이썬 조건문 (0) | 2024.03.19 |