SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
<나의 풀이>
연산을 하는 문제인데, 이번 문제는 테스트 케이스의 입력값이 여러 개다.
또한 각 수는 1 이상 10000 이하의 정수라는 제약도 있다.
그동안은 함수를 활용하지 않았는데 이번에는 함수를 활용해서 풀어보고자 한다.
[함수 def]
** 코딩 테스트에서 테스트 케이스가 입력 된 뒤에 테스트 케이스만큼 특정한 알고리즘을 수행한 결과를 반복적으로 출력하도록 요구하는 문제가 출제되는 경우가 많은데, 이럴 때는 문제를 푸는 코드를 함수화하면 매우 효과적이다.
def 함수명(매개변수):
실행할 소스코드
return 반환 값
이때 함수는 return문이 없이 작성이 가능하다.
두 개의 수 a, b를 입력받아 a를 b로 나눈 몫과 나머지를 출력하는 함수를 만들어보자.
def func(a, b):
return (a//b) , (a% b)
파이썬에서 나누기 연산 과정에서 몫을 구하는 기호는 '//'이다.
또한 나누기 연산 과정에서 나머지를 구하는 기호는 '%'이다.
은근히 헷갈리는 기호이니 잘 숙지할 수 있도록 하자.
(+) 파이썬 내장 함수 중에는 'divmod'라는 것이 있는데 이것을 통해 (몫, 나머지)와 같이 튜플 형태로 출력해주는 기능이 있다.
ex. divmod(10,3) => (3,1)
위 함수를 이용하여 입력값으로 '9 2'를 넣고 출력해보면 다음과 같다.
(4, 1)
이처럼 튜플 형태로 출력되는 것을 알 수 있고, 몫과 나머지를 잘 연산하는 것을 알 수 있다.
여기서 튜플 형태가 아니라 각각의 연산 결과를 출력하려면 다음과 같은 작업이 필요하다.
def func(a, b):
return (a//b) , (a% b)
div, mod = func(a, b)
func함수에서 출력되는 값을 순서대로 div와 mod 변수에 저장해주는 것이다.
이후 각각을 출력하면 튜플 형태가 아니게 출력이 가능하다.
4 1
그런데 처음에 언급한 것처럼 여러 개의 테스트 케이스를 입력받아야 하고, 출력의 각 줄에는 #1처럼 번호를 붙여줘야 한다.
함수를 활용해서 문제를 푸는 것보다 이것을 먼저 해결해야 할 듯하다....
우선 테스트 케이스의 개수가 3으로 주어졌고, 이후 케이스마다 몫, 나머지를 구해줘야 한다.
여기서 중요한 포인트는 '마다'라고 생각한다.
즉, 반복문을 활용해서 입력을 받아주고 각각의 테스트 케이스에 대한 연산을 해주는 것이다.
그렇다면 for 문을 사용하여 테스트 케이스를 받고 그 안에서 연산을 해주는 코드를 작성해보겠다.
for t in range(1, T+1):
여기서 T는 입력받는 테스트 케이스의 개수이다.
즉 예시처럼 3이면 1,2,3까지 반복을 하는 것이다.
그리고 각 결괏값의 번호 #t를 출력할 수 있다.
T = int(input())
for t in range(1, T+1):
print('#',t)
이를 출력하면 다음과 같다.
# 1
# 2
# 3
이후 각 케이스마다 입력되는 두 수를 a, b로 받으려면 for문안에서 받을 필요가 있다.
그리고 몫과 나머지 연산을 출력해주는 코드를 작성하면 다음과 같다.
T = int(input())
for t in range(1, T+1):
a, b = map(int, input().split())
print('#',t,a//b,a%b)
이것의 출력은 다음과 같다.
# 1 4 1
# 2 2 3
# 3 24 9
원하는 결과이지만 이것은 오답으로 처리되는데, 그 이유는 #과 숫자 사이의 공백 때문이라고 생각한다.
그래서 이를 수정하기 위한 방법을 찾아본 결과. format()을 활용하는 것이 가장 좋았다.
[string.format() 메서드]
1. string 내에서 {}
- '{} , {}'.format('a','b')
: a, b가 {}에 순서대로 들어감
2. 임의의 순서를 부여
- '{0},{1}'.format('a','b')
: a가 0에, b가 1에 들어감
3. 임의의 변수명을 부여
- '{x},{y}'.format(x=a, y=b)
: a가 x에, b가 y에 들어감
이 메서드를 사용하여 출력문을 다시 작성하면 다음과 같다.
T = int(input())
for t in range(1,T+1):
a, b = map(int, input().split())
print('#{} {} {}'.format(t,a//b,a%b))
여기서 '#{},{},{}' 가 아님을 주의해야 한다.
일반적으로 print문에서는 ','는 연결 역할을 하지만
이 메서드 안에서는 ','자체도 출력이 되기 때문에 생략해주어야 한다.
또한 출력문 조건에도 #t 이후 공백, 몫, 공백, 나머지 이런 식으로 출력해야 하므로 꼼꼼하게 작성해야 한다.
출력 결과는 다음과 같다.
#1 4 1
#2 2 3
#3 24 9
조금 어수선한 전개였지만, 이번 문제를 통해서 string.format 메서드를 배웠다.
다른 분들의 풀이에도 자주 활용되는 것을 보아, 이를 다음 문제부터는 적극적으로 활용해야겠다.
또한 이번에 실패한 함수 사용도 지속적으로 도전할 것이다.
'개발 > SWEA (D1) 문제 풀이' 카테고리의 다른 글
SW Expert Academy - 2046. 스탬프 찍기(D1) (0) | 2022.11.10 |
---|---|
SW Expert Academy - 2043. 서랍의 비밀번호(D1) (0) | 2022.11.08 |
SW Expert Academy - 2027. 대각선 출력하기(D1) (0) | 2022.11.04 |
SW Expert Academy - 2025. N줄덧셈(D1) (0) | 2022.11.04 |
SW Expert Academy - 1938. 아주 간단한 계산기(D1) (1) | 2022.11.04 |
댓글