BAEKJOON : 10820, 11655, 2609

Codren·2021년 6월 27일
0

No. 10820

1. Problem




2. My Solution

  • except EOFError 예외는 input() 함수로 입력을 받을 때만 적용 가능
  • 따라서 while() 문의 종료 조건이 존재하지 않음 -> 출력 초과
import sys

while(True):
    try:
        sentence = sys.stdin.readline()
        result = [0] * 4 
        for i in sentence:
            if 'a' <= i <= 'z':
                result[0] += 1
            elif  'A' <= i <= 'Z':
                result[1] += 1
            elif i == ' ':
                result[3] += 1
            else:
                result[2] += 1
        result[2] -= 1
        print(' '.join(map(str,result)))
    except EOFError:
        break




3. Others' Solutions

  • readline() 으로 입력 받을 때는 None 인지 아닌지 판단
  • readline() 으로 입력 받을 때는 마지막에 입력되는 Enter ('\n') 문자까지 포함됨
  • rstrip() 함수를 이용해 오른쪽에서 개행문자 ('\n') 제거
import sys

while(True):

    sentence = sys.stdin.readline().rstrip('\n')
    result = [0] * 4 

    if not sentence:    # None 이면 break
        break

    for i in sentence:
        if i.islower():
            result[0] += 1
        elif i.isupper():
            result[1] += 1
        elif i.isdigit():
            result[2] += 1
        elif i.isspace():
            result[3] += 1
    
    print(' '.join(map(str,result)))




4. Learned

  • input() 으로 입력 받을 때는 except EOFError
  • readline() 으로 입력 받을 때는 None 체크
  • 개행 문자는 '\n' 로 표시하지만 실제 내부에서는 길이 1인 개행문자로 인식되므로 ord() 결과 10 이 반환
  • strip() 의 인자로 여러 문자를 넣으면 포함되는 문자 모두 제거 (참고 블로그)




No. 11655

1. Problem




2. My Solution

  • 첫 번째 방법
  • 문자열 하나를 공백 기준으로 단어로 나눔
  • 문제 해석 잘못함 -> "출력형식이 잘못되었습니다."
import sys

sentence = sys.stdin.readline().strip().split()
result = []

for word in sentence:
    temp =''
    for char in word:
        if char.isdigit():
            temp += str(char)
        elif char.islower():
            temp += chr((((ord(char) - 97) + 13) % 26)+97)
        elif char.isupper():
            temp += chr((((ord(char) - 65 ) + 13) % 26)+65)

    result.append(temp)

print(' '.join(result))

  • 두 번째 방법
  • 문자열을 통째로 작업 수행
  • readline() 으로 입력 받을 때 오른쪽 끝의 공백만 지워야함
mport sys

sentence = sys.stdin.readline().rstrip()
result = ''
for char in sentence:
    if char.isdigit():
        result += str(char)
    elif char.islower():
        result += chr((((ord(char) - 97) + 13) % 26)+97)
    elif char.isupper():
        result += chr((((ord(char) - 65 ) + 13) % 26)+65)
    elif char.isspace():
        result += ' '

print(result)




3. Learned

  • 문제의 출제 의도를 잘 파악하자
  • 문자열 중간에 공백도 포함시켜야 될 때는 strip() -> rstrip() 적용




No. 2609

1. Problem




2. My Solution

  • 첫 번째 방법
  • 9999 9998 일때 최소 공배수는 99970002 이므로 대략 1억번 연산이 이루어짐 -> 시간 초과
import sys

a,b = map(int,sys.stdin.readline().rstrip().split())
max_num = 0
min_num = 0

i = min(a,b)
while(i > 0):
    if a % i == 0 and b % i ==0:
        max_num = i
        break

i = min(a,b)//max_num

while(True):
    if max_num * i % a == 0 and max_num * i % b ==0:
        min_num = max_num * i
        break
    else:
        i += 1

print(max_num)
print(min_num)

  • 두 번째 방법
  • 최대 공약수와 최소 공배수의 관계를 이용
import sys

a,b = map(int,sys.stdin.readline().rstrip().split())

i = min(a,b)
while(i > 0):
    if a % i == 0 and b % i ==0:
        max_num = i
        break
    else:
        i -= 1
min_num = a*b // max_num

print(max_num)
print(min_num)




3. Learned

  • 두 수의 곱 = 최대 공약수 * 최대 공배수
  • time.start () 함수를 이용하여 어느 부분에서 시간이 오래 걸리는지 파악하자

0개의 댓글