백준 3~4단계 코딩테스트

릿·2023년 2월 15일
0

코딩테스트

목록 보기
25/27

1. OX퀴즈

문제: "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력: 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력: 각 테스트 케이스마다 점수를 출력한다.

1. 내 풀이

  • 이중 for문을 써서 문자열을 list로 변환한 후, O가 있으면 cnt에 1을 더해 sum에 넣어주고, O가 연속해서 있으면 cnt에 1을 더해 sum에 넣어주고, O가 아니면 cnt를 초기화해주는 식으로 문제를 풀었다.
n = int(input())

for i in range(n) :
    li = list(input())
    sum = 0
    cnt = 0
    for j in range(len(li)) :
        if li[j] == 'O' :
            cnt += 1
            sum += cnt
        else :
            cnt = 0
    print(sum)

2. 평균은 넘겠지

문제: 대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력: 첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력: 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

1. 내 풀이

이중 for문으로 하나는 평균을 구하고, 하나는 평균보다 높은 학생을 카운트하여 퍼센트를 구했다.
ide에서는 됐는데 백준에서는 틀렸다고 나옴ㅠ

a = int(input())
    
for i in range(a) :
    li = list(map(int, input().split()))
    sum = 0
    cnt = 0

    for j in range(1, li[0]+1) :
        sum += li[j]
    average = sum/li[0]
    
    for k in range(1, li[0]+1) :
      if li[k] > average :      
        cnt += 1
    print(str(round(cnt/li[0]*100, 3))+'%')

그래서 다른 블로그를 참고해서 출력부분을 바꿔보았다

// 이전
print(str(round(cnt/li[0]*100, 3))+'%')

// 이후
rate=cnt/li[0]*100
print('{0:0.3f}%'.format(rate))

그러니까 정답으로 뜸.

2. 오답풀이

'{}'.format(숫자) 이런 형식으로 쓰는 건 format함수라고 한다

그렇다고 타입이 숫자인 건 또 아닌 것 같다.

1. format함수 정의 & 사용법

  • format함수는 문자열이 가지고 있는 함수로 아래와 같이 쓸 수 있다.
print("{}".format(10)) # 10
print("{} {}".format(10, 20)) # 10, 20
print("{}년 {}월 {}일".format(2022, 10, 18)) # 2022년 10월 18일
  • 숫자의 경우는 ':'의 앞은 format에 콤마를 기준으로 쓰여진 변수 또는 숫자의 index를 나타내고 하나면 생략이 가능하다. ':'의 뒤는 표기할 자리수를 의미한다.
# 실수를 소수 두번째 자리까지 표기하겠다
"{index(생략가능):.2f}".format(실수)
(출처: https://ming-jee.tistory.com/124)

2. f-string의 정의 & 사용법

  • f-string은 문자열을 합칠 때 사용한다. format함수를 더 간단하게 사용한 형식이다.
person1 = "철수"
person2 = "영희"

# 더하기 키워드
print(person1 + "는 " + person2 + "를 좋아한대요!")
# % 서식
print("%s는 %s를 좋아한대요!"%(person1, person2))
# str.format 함수
print("{}는 {}를 좋아한대요!".format(person1, person2))
# f-string 사용
print(f'{person1}는 {person2}를 좋아한대요!')
  • 숫자의 경우
a = 10
print(f"a: {a}") # 10
print(f"a: {a:.2f}") # 10.00
print(f"소수점 셋째자리 : {a:.3f}") # 소수점 셋째자리 : 10.000

이런 식으로 쓸 수 있다.

(출처: https://blog.naver.com/isc0304/222265925637)

3. round함수의 문제점

  • round함수의 문제점은 끝자리가 0이면 출력하지 않는다고 한다.
print(round(40.000, 3)) # 40.0
(출처: https://ming-jee.tistory.com/124)

3. 다른 사람의 풀이

  • 평균을 구할 때 sum함수를 사용해서 리스트를 전부 더하는 방법이 있었다.
  • 해당 문제의 경우 0번 인덱스를 빼야하므로 data[1:]을 하면 1번 인덱스부터 나머지 인덱스까지의 배열을 저장할 수 있다고 한다.
n = int(input())
for _ in range(n):
    data = list(map(int, input().split()))
    m = data[0]
    data = data[1:]
    mean = sum(data)/m
    count = 0
    for i in range(m):
        if data[i] > mean:
            count += 1
    print("{:.3f}%".format(count/m*100))

3. 빠른 A+B

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

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

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

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

1. 내 풀이

빠른 입출력을 사용해야할 때는 input()보다 sys.stdin.readline()을 써야한다고 한다

import sys

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

for i in range(n) :
    a, b = map(int, sys.stdin.readline().split())
    print(a+b)

4. A+B - 5

문제: 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력: 입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
입력의 마지막에는 0 두 개가 들어온다.


출력: 각 테스트 케이스마다 A+B를 출력한다.

1. 내 풀이

while문 조건문에 취약한지라 while문 조건만 검색해서 찾아봤다.
True로 하면 무한루프에 걸릴 확률이 높지만 제대로 빠져나갈 곳만 만들어 놓으면 써도 괜찮다는 걸 알았다.

while True :
    a, b = map(int, input().split())
    if a == 0 and b == 0 :
        break
    else :
        print(a+b)

5. A+B - 4

문제: 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력: 입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력: 각 테스트 케이스마다 A+B를 출력한다.

1. 내 풀이

해당 문제는 끝이 언제라는 걸 알 수가 없어서 무조건 에러가 날 수 밖에 없는 조건이었다.

그래서 실행해야하는 코드는 try문에, 에러가 나면 break가 되도록 코드를 짜야한다는 걸 배웠다.

while True :
    try :
        a, b = map(int, input().split())
        print(a+b)
    except :
        break
profile
항상 재밌는 뭔가를 찾고 있는 프론트엔드 개발자

0개의 댓글