본문 바로가기
알고리즘/백준

1차원 배열(10818, 2562, 3052, 1546, 8958, 4344)

by 수쨔앙 2022. 9. 6.

10818

문제 N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
입력 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다.
모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
출력 첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.
1)
import sys

n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))

print(min(a), max(a))


2)
import sys

a = int(sys.stdin.readline())
lst= list(map(int, sys.stdin.readline().split()))
min_num = lst[0]
max_num = lst[0]

for i in lst[1:]:
    if i < min_num:
        min_num = i
    elif i > max_num:
        max_num = i

print(min_num, max_num)

 

import sys

n = int(sys.stdin.readline())
lst = []
min = 0
max = 0

for i in range(n):
    a = list(map(int, sys.stdin.readline().split()))
print(min(a), max(a))

이렇게 쓰니까 에러가 났다..

 

Traceback (most recent call last):
  File "C:/Users/sizza/OneDrive/바탕 화면/project/dd.py", line 10, in <module>
    print(min(a), max(a))
TypeError: 'int' object is not callable

 

 

예약어를 변수로 사용했다는 것이다...!!

얼른 지워주자 

import sys

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

for i in range(n):
    a = list(map(int, sys.stdin.readline().split()))
print(min(a), max(a))

그랬더니 이번엔 또 다른 에러가..ㅎㅎㅎ

 

Traceback (most recent call last):
  File "C:/Users/sizza/OneDrive/바탕 화면/project/dd.py", line 8, in <module>
    print(min(a), max(a))
ValueError: min() arg is an empty sequence

 

이번엔 함수에 빈 시퀀스를 전달할 때 이런 오류가 발생한다고 합니다....!

도대체 뭐가 빈 시퀀스라는걸까...ㅎㅎ....

 

그래서 찍어줘봤더니

진짜 비워져있었다.....!!!

 

아 뭐가 문제지 고민하던중...

도대체 저기에 for문은 왜 있는거지...??

원래 리스트 원소 첫번째꺼랑 두번째꺼 비교해서 작은거를 min에 저장, 다음 작은거랑 그다음거랑 비교해서 작은거 저장.... 뭐 이런식으로 하려고 for 문을 돌리려고 했던건데

min, max 내장함수를 사용할거면 for문이 왜 들어가있니...

당장 빼주자

import sys

n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))

print(min(a), max(a))

했더니 성공...!!!!!!

이긴한데 원래 해보려고 했던 방식으로도 한번 해보자

import sys

a = int(sys.stdin.readline())
lst= list(map(int, sys.stdin.readline().split()))
min_num = lst[0]
max_num = lst[0]

for i in lst[1:]:
    if i < min_num:
        min_num = i
    elif i > max_num:
        max_num = i

print(min_num, max_num)

나는 저 리스트의 for문을 잘못알고있었다.

for i in lst[1:]:

   if i < min_num:

여기가 이해가 안갔었다.

lis[i] < min_num 으로 써야되는줄 알았다..

이제라도 알았으니 다행...ㅎㅎ

 

 

 

 

2562

문제 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
입력 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
출력 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
import sys

lst=[]

for i in range(9):
    a = int(sys.stdin.readline())
    lst.append(a)

b = max(lst)
count = 0

print(b)

for i in lst:
    count += 1
    if i == max(lst):
        print(count)

 

import sys
a = list(map(int, sys.stdin.readline().split()))
b = max(a)
count = 0

print(b)

for i in a:
    count += 1
    if i == max(a):
        print(count)

처음에 이렇게 입력을 했더니 답은 정말 잘 나오는데 틀렸다고 했다...ㅜㅜ

문제를 잘 읽어보니까

한줄에 한개씩 입력받게 하라고 되어있.... 문제도 잘 안읽고 풀다니 틀려도 싸다...!!!!!!

 

다른사람 코드를 보니까 

int(input())을 for 로 돌리는 사람도 있었다!! 신기..

이런방법이...!!

n_list = [int(input()) for i in range(9)]
n_max = n_list[0]
idx = 0
for i in range(1, len(n_list)):
    if n_list[i] > n_max:
        n_max = n_list[i]
        idx = i

print(n_max)
print(idx+1)

 

 

 

3052

문제 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
출력 첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
import sys
lst = []

for i in range(10):
    a = int(sys.stdin.readline())
    b = a % 42
    lst.append(b)

set_lst = set(lst)
print(len(set_lst))

먼저 위 문제처럼 한줄에 숫자 하나씩 주어진다고 했으니 

for문을 돌려서 a = int(sys.stdin.readline())값을 받아오자

그리고 a % 42 를 b라고 하고, 그 값들을 lst에 담아두자

 

근데 list는 중복이 허용된다..!! 문제에서는 서로 다른 나머지가 몇개 있는지 출력하라고 했으니

중복이 허용되지 않는 set으로 바꿔줘야겠다!

 

바로 오늘 배웠던!!!!! list를 set으로 자료형 변환!!!!!!!!!ㅎ.ㅎ

https://sizzang97.tistory.com/63

 

Python 특강 (2)

python 활용 자료형 활용하기 더하기  x + y 빼기 x - y 곱하기 x * y 제곱 x ** y 2**16 = 65536 나누기 x / y int와 int를 나누더라도 연산결과는 항상 float ex) 4 / 2 = 2.0,  5 / 2 = 2.5 나머지없는 나누..

sizzang97.tistory.com

 

set_lst = set(lst)
print(len(set_lst))

요러케 해주니 바로 짠~!!ㅎ.ㅎ 아싸뵤

 

 

 

1546

문제 세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
입력 첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.
출력 첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.
import sys

n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
lst = []
s = 0

for i in a:
    b = (i/max(a))*100
    lst.append(b)

for i in lst:
    s += i

print(s/n)

 

일단 값을 먼저 받아와야하는데 과목수를 받아오고,

점수는 위의 문제와 다르게 한줄에 다 받아오는거니까

a = list(map(int, sys.stdin.readline().split()))로 받아오자.

 

그리고 for로 a리스트를 돌려주면서 과목점수를 최대값으로 나눠주고 100을 곱해준다음

lst 에 추가 해주자!

lst를 돌려주면서 다 더해주고 개수로 나누면 새로운 평균 짜잔~!

 

 

 

8958

문제 "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
출력 각 테스트 케이스마다 점수를 출력한다.
 

아아악 이건 진짜 어렵다

어떻게 짜야 할 지도 모르겠어서 낑낑대다가

다음날 아침에 풀었다..^^ 자고 일어나서 첫문제로 풀어서인가 한번에 풀렸다..ㅎㅎㅎ..

 

처음에 테스트 개수를 받고,

score = 0, sum_score = 0 를 줬다.

왜냐면 O를 만났을때 score를 올려 줄거고, X를 만났을 때 sum_score에 score를 저장해주고

score를 0으로 리셋해줄 것이기 때문!!

 

어렵게 생각하지말고 말 그대로 하나하나 짜봤다.

import sys

n = int(sys.stdin.readline())
score = 0
sum_score = 0

for i in range(n):
    a = list(sys.stdin.readline().split())
    for j in a:
        if j == 'O':
            score += 1
        else:
            sum_score += score
            score = 0
    print(sum_score)

그랬더니 안돌아가.... 자꾸 score가 더해지지를 않았다

정신 똑띠차리고 보니, sum_score가 저기 있으면 안될것같다

import sys

n = int(sys.stdin.readline())
score = 0
sum_score = 0

for i in range(n):
    a = list(sys.stdin.readline().split())
    for j in a:
        if j == 'O':
            score += 1
            sum_score += score
        else:
            score = 0
    print(sum_score)

 

옮기고 돌렸더니 첫번째 값은 맞게 나오는데 그 다음부터 이상한 값이 나오기 시작했다

뭔가 잘못되었다....

 

score랑 sum_score가 저기 있으면 안되는구나..

a리스트 위에 있어야 하나하나 돌때마다 새로 값이 되겠구나...!!!!

import sys

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

for i in range(n):
    a = list(sys.stdin.readline().split())
    score = 0
    sum_score = 0

    for j in a:
        if j == 'O':
            score += 1
            sum_score += score
        else:
            score = 0
    print(sum_score)

이렇게 했는데도 또 또 또!!!!!!! 또 틀렸대!!!!!!!!!!!!! 뭐야아아아아아아아아!!!!!!!!!!!!!!!

 

아 내맘대로 split()으로 공백을 줬구나...^^.. 

뉘예뉘예 바꿔드려야쥬

import sys

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

for i in range(n):
    a = list(sys.stdin.readline())
    score = 0
    sum_score = 0

    for j in a:
        if j == 'O':
            score += 1
            sum_score += score
        else:
            score = 0
    print(sum_score)

드디어 맞았다!!!!!!!!!

아싸뵤~~~~~

 

 

4344

문제 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
입력 첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
import sys

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

for i in range(n):
    a = list(map(int, sys.stdin.readline().split()))
    avg = (sum(a)-a[0])/a[0]
    num = 0
    for i in range(1,len(a)):
        if a[i] > avg:
            num += 1
    per = round((num / (len(a)-1))*100,3)
    print(f'{per:.3f}%')

와 이것도 너무 어려웠다.

먼저 테스트 개수를 받아오고

그 개수만큼 리스트를 받아오자

리스트 받아서 평균을 구해주는데 합을 구할때 첫번째 숫자는 학생수니까 a[0]는 뺴줘야한다!

그리고 a[0]이 학생수니까 a[0]로 나눠주고!

 

그리고 중요한데

num = 0을 주고 시작하자 왜냐면 평균 넘는 사람 수를 구할거다!

그리고 for로 돌려수는데 이것도 마찬가지로 첫번째는 학생수니까 

범위를 range(1, len(a))로 하자

a리스트에서 for문을 돌리는데

평균보다 크면 num을 1씩 올려주는것!!!!

 

이제 퍼센트를 구하면 되는데

반올림은 round를 이용하는거다!!

반올림 주고, fstring으로 print해주자!

 

 

 

 

 


 점점 어려워진다...!!!

그래도 재밌당ㅎㅎㅎㅎ

 

오늘은 개수는 적었는데 시간은 오래걸린것같다!

for이 반복적으로 쓰이다보니 조금은 익숙해진 기분이라 좋다ㅎㅎ

 

못풀었던 1문제는 내일 다시 도전해봐야겠다!!(히히 성공)

 

하나하나 해보면서 고쳐가는 재미가 솔직히 조금 있다

ㅋㅋㅋㅋㅋㅋㅋㅋㅋ실패뜨면 너무 짜증나면서도 어디가??? 하면서 찾는 재미도 쪼꼼 있고

하나하나 고칠때도 아싸뵤~ 하는게 쬐끔 아주 쬐에에에에에끔 재밌다ㅎ.ㅎ

728x90

댓글