https://www.acmicpc.net/problem/2588


> 풀이

입력받은 두 수중 두번째 수를 1의 단위, 10의 단위, 100의 단위릐 차례로 첫번째 수와 곱셈하여 출력한 뒤 두 수의 곱을 출력하는 문제이다.

 

> 풀이의 두가지 방향

1. 두 번째 수를 문자열로 입력받아 list 처럼 활용하여 문제 해결

2. int 형의 두 번째 수를 '//' 과 '%' 연산자를 이용하여 문제 해결

 

a = int(input())
b = input()

print(a*int(b[2]))
print(a*int(b[1]))
print(a*int(b[0]))
print(a*int(b))
a = int(input())
b = int(input())

print(a*(b%10))
print(a*((b%100)//10))
print(a*(b//100))
print(a*b)

 

> 리뷰

 

두 가지 방법에서 연산자들로 해결하는 두번째 방법이 속도면에서 조금이나마 빠른 모습을 보인다.

> 문제

(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

> 입력

첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)

> 출력

첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.


> 풀이

입력 : 세 수(A, B, C )

출력 :

1. (A+B)%C

2. ((A%C) + (B%C))%C

3. (A×B)%C

4. ((A%C) × (B%C))%C 

a, b, c = map(int, input().split())
print((a+b)%c)
print(((a%c)+b%c)%c)
print((a*b)%c)
print(((a%c)*(b%c))%c)

> 문제

ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

 

> 입력

서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

 

> 출력

불기 연도를 서기 연도로 변환한 결과를 출력한다.


> 풀이

문제를 통해 볼기 연도는 서기 연도와 543년의 차이가 있다는 점을 알 수 있다. (2541년-1998년 = 543)

입력받은 불기 연도에서 543을 빼서 출력하는 문제이다.

print(int(input())-543)

>문제

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

>입력

첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.

>출력

첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.


> 풀이

입력받은 문자열에 뒤에 '??!' 를 연결하여 출력하는 문제이다.

name = input()
name += "??!"
print(name)

속도는 차이 없겠지만 코드를 줄이기 위해 다음과 같이 작성 가능하다.

name = input()
print(name + "??!")

더욱 더 줄이면 다음과 같이 줄이는 것도 가능하다

print(input() + "??!")

 

세 경우 모두 실행 시간에 있어 차이 없으며 코드길이를 줄이는 부분과 코드를 쉽게 알아볼 수 있는 부분의 제로썸과 같은 부분이다.

> 문제

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

> 입력

두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)

> 출력

첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A*B, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다.


> 풀이

a, b = map(int, input().split())
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)

 

> 주의할 점

문제에서 나누기 부분에 A/B 가 있지만 그 뒤를 보면 (몫) 이라고 써있다는 점을 잘 봐야 한다.

풀이의 '//' 연산을 이용하는 법도 있지만, int(a/b) 를 이용하는 방법도 있을 수 있다.

> 문제

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

> 입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

> 출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다


> 풀이

a, b = map(int, input().split())
print(a/b)

> 문제

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

> 입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

> 출력

첫째 줄에 A×B를 출력한다.

 

> 풀이

a, b = map(int, input().split())
print(a*b)

 

> 리뷰

이번 문제에서도 입력에 걸려 있는 제약에 대해서는 고민이 필요 없이 간단하게 풀어야 정답 처리가 되는 점이 보인다.

input() 안에 string 문을 넣기만 했을뿐이데도 오답 처리가 되어 약간 놀라웠다.

 

> 오답 처리 되었는 코드

a, b = map(int, input("두 수를 입력하세요:").split())
print(a*b)

> 문제

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

 

> 입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

> 출력

첫째 줄에 A-B를 출력한다.


> 프로그램 실행 순서

1. 두 수를 입력받는다

2. 두 수가 0~10 사이의 수인지 확인하다

3-1. 두 수가 0~10 사이의 수가 아니다

3-1-1 1로 돌아간다

3-2 두 수가 0~10 사이의 수이다.

3-3-1 앞의 수에서 뒤의 수를 빼줘서 출력한다.

3-3-2 종료

while True:
    a, b = map(int,input("0과 10 사이의 두수를 입력하세요 :").split())
    if a > 0 and a < 10 and b > 0 and b < 10:
        print(f"두 수의 차는 {a-b}입니다.")
        break

 

하지만, 위처럼 풀어 제출하게 되면 이상하게도 틀렸다는 결과를 듣게 된다.

오히려 문제의 조건에서 0과 10사이의 숫자라는 제약을 무시하고 풀게되면 정답으로 표시된다.

a, b = map(int,input().split())
print(a-b) # 이러면 정답 처리

 

>>> 주요 강의 내용

- python 언어의 역사와 특징에 대한 강의

- python 변수와 자료형

 

>>> 인상 깊었던 세부 내용

1. 타입 힌팅

- ex) a:int = 5

- C언어처럼 데이터 타입을 명시하며 코딩하는 방식

- 타입을 명시했지만 다른 데이터 타입을 할당해 줄 수는 있음

- 코드가 길어지고 커지면 데이터 관리에 용이함

- 단점

     1. 유지보수에 비용이 많이 듬 - 추후 데이터 타입의 변경 발생 시 코드 변경이 힘듬

     2. 유동적이며 자유로움을 추구하는 파이썬과 맞지 않다는 의견이 있음

 

2. 파이썬 설계 철학 중: 명시적인 것이 암시적인 것보다 낫다

   - 'is' vs '=='

  • is : 동일한 메모리 위치를 확인
  • == : value 가 같은지 확인
  • integer 에 한해서는 같은 값의 변수들을 같은 메모리에 할당하기에 is, == 의 결과에 차이를 보인다.
a = 3
b = 3
print(a==b) #True
print(a is b) #True

c = [1,2,3,4,5]
d = [1,2,3,4,5]
print(c is d) #False
print(c == d) #True

 

3. 파이썬 설계 철학 중: 복잡한 것이 난해한 것보다 낫다

  • 에러에 대한 에러 코드와 명확한 내용을 명시함으로서 에러발생 시 정확하게 파악할 수 있게 한다.
  • 이 부분은 학부 시절 좋은 개발자에 대해 말씀해 주셨던 교수님의 강의 내용을 떠올리게 해서 기억에 남았다.
    • 순서도 잘 그리고 설계를 잘 해야 한다. 알고리즘을 많이 알고 제대로 이해해야 한다. 에러를 잘 다뤄야 한다.. 등등 예전 생각이 많이 났다.

+ Recent posts