[백준][1차원 배열] 10871번 -python

랼류·2023년 11월 28일
1
post-thumbnail

백준 10807번: 개수 세기

문제


정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

입력


첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

출력


X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

입출력예시



문제풀이1 - 원초적으로 출력하기

1차원 배열, 10871번: X보다 작은 수

앞 문제와 동일하게 배열을 입력받는다. 이후에 주어진 X보다 작은 수를 찾아 공백을 넣어 예쁘게 출력하는 문제이다.
나는 항상 코드를 신박하게 생각하지 못하기 때문에 원초적인 방법으로 풀어봤다.

  1. 앞부분은 10807번과 동일하게 split으로 배열을 받고, for와 if를 사용해 배열 요소를 하나씩 확인해 출력했다. 이때 출력하는 방식을 함수없이 있는 그대로 진행해보았다.
*진행방법 요약*
1) N, X를 map기능을 이용해 입력받음(int형으로).
2) 수열(배열)을 split()기능을 활용해 리스트로 입력받음(string형).
3) 결과값(string)을 담을 변수 생성
4) 수열에 대해 for loop 진행
5) 수열에 담긴 값을 int형으로 변환해 X와 비교
6) 생성한 문자열에 조건에 맞는 값과 공백 입력
7) 결과값 변수 출력
  • 작성코드
N, X = map(int, input().split())
n_list = input().split() #요소를 문자로 받기

out = '' #출력할 빈 문자열 생성
for i in n_list:
    if int(i) < X: #비교를 위해 i를 숫자로 변경
        out = out + i + " " #생성된 out_list에 특정 요소와 구분을 위한 공백을 문자로 추가
        
print(out_list)
  • 이때 결과값을 담을 문자열 없이 바로 for loop 안에서 print를 진행하면 결과값이 줄바꿈으로 구분되어 출력됨
  1. += 연산자를 사용하도록 작성하면 다음과 같이 작성이 가능하다.
    !! 이때, 리스트를 처음부터 int로 input하면 string인 out 변수에 요소를 추가할 때 오류가 발생한다. 애초에 out 변수를 string으로 설정했기 때문이다.
  • 작성코드
N, X = map(int, input().split())
n_list = input().split()

out = '' #출력할 빈 문자열 생성
for i in n_list:
    if int(i) < X:
        out += i
        out += " "
        
print(out)

문제풀이2 - 코드다운 코드로 작성하기

앞에서와는 다르게 문자열로 출력값을 만들지 않고 end 기능을 사용해 앞에서보다 멋진 코드를 작성하는 방법도 있다.
해당 방법을 사용해 코드를 작성하면 코드가 훨씬 간결해지고, 결과값을 담을 변수를 따로 만들지 않아도 된다는 장점이 있다. 그리고 훨씬 코드같아졌다..!

이때 배열 입력을 map기능에서 int로 받았기 때문에 if문에서 따로 i를 int로 변환해주지 않았다.
또한, 단순 print로 결과를 보여주기 때문에 문자의 형식도 크게 신경쓰지 않아도 된다.

*진행방법 요약*
1) N, X, 수열을 map기능을 이용해 입력받음(int형으로)
2) 수열에 대해 for loop 진행
5) 수열에 담긴 값을 int형으로 변환해 X와 비교
6) 생성한 문자열에 조건에 맞는 값과 공백 입력
7) 결과값 변수 출력
  • 작성코드
N, X = map(int, input().split())
n_list = map(int, input().split())

for i in n_list:
    if i < X:
    	print(i, end = ' ') # i 출력 후 뒷부분을 \n(줄바꿈)이 아닌 공백으로 끝냄

문제풀이3 - N을 외면하지 않는 법

앞에서 사용한 두가지 방법 모두 N을 사용하지 않았다.
출제자가 N을 줬으니 입력받은 모든 요소를 알차게 사용하는 방법도 알아보자!

N은 수열(배열)이 몇개의 정수로 이루어져 있는지 알려준다. 문제를 풀 때 for loop을 입력받은 배열의 모든 요소 대해 진행시켰다. 이 배열의 개수를 직접 for loop에 입력하는 방식을 사용해볼 수 있다.

이때는 range(N)에 대해 for loop을 진행하기 때문에 i를 그대로 사용하면 i는 0부터 N-1까지 출력된다. 따라서 리스트의 indexing 기능을 사용한다.
.split() 기능은 출력값이 리스트이기 때문에 아래 코드와 같이 []를 사용해 indexing을 하고, 이때 X와는 수 비교이기 때문에 int형식으로 만든다.

  • 작성코드
N, X = map(int, input().split())
n_list = input().split()

for i in range(N):
    if int(n_list[i]) < X:
    	print(n_list[i], end = ' ')

사용 함수 - end=

end=

: print()기능의 설정 함수로 print한 값 뒤에 붙는 문자를 설정

  • 사용 방법(형태)
    print(출력내용, end = "")
    _#기본값: end = "\n"(줄바꿈)
  • Ex.
print('안녕', end = "? ")
print('오늘 뭐해', end = "?\n")
print('이따 점심 뭐 먹을래', end = "~?")
# output; 안녕? 오늘 뭐해?
#이따 점심 뭐 먹을래~?
print('Today') #end 값을 입력하지 않으면 다음 print값은 줄바꿈 후 출력
print('Yesterday', end=',')
print('tomorrow', end = '')
print('.')
# output; Today
# output; Yesterday,tomorrow.

사용 함수 - range()

range()

: 연속된 숫자의 범위를 지정해주는 함수
input - 정수,
out - int형

  • 사용 방법(형태)
    range(start, stop, step)
  • Ex.
for i in range(3):
	print(i)
#output; 0'\n'1'\n'2'\n'

시행착오

  • 들어오는 요소가 int형인지 string형인지 정확히 인지하지 않고 있는 상황이었다. string과 int를 비교하는 코드를 작성해 오류가 발생했다.
    각 변수가 어떤 형을 가지고 있는지 맞춰주는 작업은 어렵지 않았지만, 코드를 실행하기 전 여러 번 코드를 봐도 인지하지 못한 실수였다.
    오늘도 아쉬움이 남는 코드 실력이었다.

오늘의 교훈

  • 변수가 어떤 형태인지 아는 것은 중요하다. 항상 int는 int와, string은 string과 비교하자.
  • 문제를 푸는 방법은 다양하다. 하지만 나는 그 많은 방법 중 조금 더 긴 코드 밖에 생각하지 못한다.
    다양한 함수를 익혀서 더 간결한 코드를 만들어보자.
profile
준비~ 시작!

1개의 댓글

comment-user-thumbnail
2023년 12월 2일

저는 늘 N을 외면하고 살았습니다 ...
'짧은 코드를 위해서라면.. N이야 뭐.. 크게 중요한가?' 라는 생각으로요 ...
그런데 어제.. 제 꿈에서 N이 나타났지 뭐에요 ...
온 몸이 검은데 이마에 N이 써져있더라구요.. 초록색.. 네이버처럼요 ..
제게 울부짖더라구요.. 내가 안보이냐며.. 내가 우습냐며.. 너도 나처럼 되고 싶냐며 ..
그래서 앞으로는 N을 무시하지 않기로 했습니다.. 교회도 열심히 다닐 거구요 ..
랼류님도.. 절대 N을 무시하지 마세요.. 이걸 보는 여러분도 ..

답글 달기