-
[백준 문제풀이] 1단계 - 입출력과 사칙연산알고리즘&자료구조(Algorithm&Data Structure) 2021. 4. 22. 04:25
[백준 문제풀이] 1단계 - 입출력과 사칙연산
목차
- 개요
- 1. Hello World!
- 2. We love kriii
- 3. 고양이
- 4. 개
- 5. A + B
- 6. A-B
- 7. A×B
- 8. A/B
- 9. 사칙연산
- 10. 나머지
- 11. 곱셈
- 마치며.
개요
- 소스 저장소
github URL
commit dc8d72141b4c20924038dd41a2d1e265b33071cd
백준 알고리즘 문제풀이를 시작하려고 한다.
깔끔한 기록을 위해 가장 낮은 단계부터!
첫번째 단계는'입출력과 사칙연산'
1. Hello World!
문제 URL : Hello World!
문제
Hello World!를 출력하시오.
입력
없음
출력
Hello World!를 출력하시오.
예제 입력 1
예제 출력 1
Hello World!
1print("Hello World!")cs
첫 문제는 역시 "Hello World!"였다.
C언어로 이걸 처음 찍어봤을 때가 떠오른다.
코드는 뭐... 딱히 설명이 필요한 수준은 아닌 거 같다.2. We love kriii
문제 URL : We love kriii
문제
ACM-ICPC 인터넷 예선, Regional, 그리고 World Finals까지 이미 2회씩 진출해버린 kriii는 미련을 버리지 못하고 왠지 모르게 올해에도 파주 World
Finals 준비 캠프에 참여했다.
대회를 뜰 줄 모르는 지박령 kriii를 위해서 격려의 문구를 출력해주자.
입력
본 문제는 입력이 없다.
출력
두 줄에 걸쳐 "강한친구 대한육군"을 한 줄에 한 번씩 출력한다.
1print("강한친구 대한육군\n강한친구 대한육군")cs
문제 이름이 좀 특이했다.
단순한 출력 문제에 스토리를 넣었다는 것도 신기했다.이 문제도, 딱히 코드의 설명이 필요할 거 같진 않다.
3. 고양이
문제 URL : 고양이
문제
아래 예제와 같이 고양이를 출력하시오.
입력
없음.
출력
고양이를 출력한다.
예제 출력
\ /
) ( ')
( / )
(__)|
1234print("\\ /\\")print(" ) ( \')")print("( / )")print(" \\(__)|")cs
단순한 출력 문제이긴 한데, 유의해야 할 부분이 있다.
print함수로 (백슬래쉬()를 출력할 때는 반드시 백슬레쉬를 하나 더 적어줘야 한다.
너무 오랜만에 코딩을 해서 그런지 이런 기초적인 것도 깜빡하고 있었다.
3번이나 컴파일 에러를 일으키는 실수를 범해버렸다.4. 개
문제 URL : 개
문제
아래 예제와 같이 개를 출력하시오.
입력
없음.
출력
개를 출력한다.
예제 출력
|_/|
|q p| /}
( 0 )"""
|"^"` |
||/=\_|
12345print("|\\_/|")print("|q p| /}")print("( 0 )\"\"\"\\")print("|\"^\"` |")print("||_/=\\\\__|")cs
이번 문제도 이전 문제와 똑같이 풀 수 있다.
제공되는 예제 출력문을 그대로 복사한 뒤 print함수로 감싸주면 되는데
마찬가지로 유의할 부분이 있다.
백슬래쉬()와 따옴표(", ')앞에는 항상 백슬래쉬()를 하나 더 넣어줘야 한다.
안 그러면 컴파일 오류가 발생한다.5. A + B
문제 URL : A + B
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
첫째 줄에 A+B를 출력한다.
예제 입력 1
1 2
예제 출력 1
3
12a, b = map(int, input().split() )print(a+b)cs
두 정수를 입력받아 그 합을 구하는 문제.
이것도 어렵지 않게 풀 수 있지만, 유의해야 할 점 하나.두 정수를 한 줄에 입력받는다는 것.
1a, b = int( input() )cs 처음에는 이렇게 생각을 했었는데, 이러면 에러가 뜬다.
input함수는 데이터를 String형태로 입력 받는다. 그럼 제시된 예제 입력값대로 입력을 받았다고 하면,- "1 2"
이렇게 생긴 문자열이 들어올 것이다.
당연히 위와 같은 데이터는 int형으로 바꿀 수 없다.
단순히 숫자만 들어있는 게 아니라 공백까지 포함되어 있기 때문.그래서 split함수를 통해 공백을 기준으로 두 숫자를 나눠준 다음 int형으로 변환을 해줘야 한다.
split함수는 리스트 형태로 값을 반환한다. 그래서 리스트의 데이터 형식을 한번에 변환해주는 map함수를 사용한 것이다.이번 문제를 통해 리스트의 형변환이 어떻게 이루어지는지를 배웠다.
6. A-B
문제 URL : A-B
문제
두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
첫째 줄에 A-B를 출력한다.
12a, b = map(int, input().split() )print(a-b)cs
위의 문제와 동일하게 풀면 된다.
print함수에서 a+b를 a-b로만 바꿔주면 풀이가 가능하다.7. A×B
문제 URL : A×B
문제
두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
첫째 줄에 A×B를 출력한다.
12a, b = map(int, input().split() )print(a*b)cs
이것도 마찬가지.
print함수에서 a*b로 바꿔주면 풀이가 가능하다.8. A/B
문제 URL : A/B
문제
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.
예제 입력 1
1 3
예제 출력 1
0.33333333333333333333333333333333
12a, b = map(int, input().split() )print(a/b)cs
이것도 마찬가지.
print함수에서 a/b로만 바꿔주면 풀이가 가능하다.9. 사칙연산
문제 URL : 사칙연산
문제
두 자연수 A와 B가 주어진다. 이때, A+B, A-B, AB, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오.
입력
두 자연수 A와 B가 주어진다. (1 ≤ A, B ≤ 10,000)
출력
첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 AB, 넷째 줄에 A/B, 다섯째 줄에 A%B를 출력한다.
예제 입력 1
7 3
예제 출력 1
10
4
21
2
1
123456a, b = map(int, input().split() )print(a+b)print(a-b)print(a*b)print(a//b)print(a%b)cs
이건 지금까지 풀었던 사칙연산 문제의 종합이다.
위에서 풀었던 문제들의 print문을 그대로 가져오면 되는 문제인데, 딱 하나 주의할 점이 있다.
문제를 잘 보면 "a/b(몫)"라고 적혀있는 걸 확인할 수 있다.
파이썬에서 나눗셈은 'a/b'와 'a//b'가 있는데,'a/b'는 소숫점 아래까지의 결과를 반환하고, 'a//b'는 소수자릿수를 표현하지 않는다.
몫만 구하라고 되어 있으면 a//b를 쓰는 게 맞는 것이다.
처음에는 'a/b'라고 적었는데 틀렸다는 메시지가 나오는 걸 보고 'a//b'로 바꿔서 풀이에 성공했다.10. 나머지
문제 URL : 나머지
문제
(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를 출력한다.
12345A, 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 )cs
갑자기 등장하는 수 많은 수식들에 당황할 수 있지만, 결국에는 Ctrl + C와 Ctrl + V만 잘 활용하면 된다.
문제에서 변수들이 모두 대문자로 적혀 있길래 나도 변수를 모두 대문자로 선언해 주었다.
또한, 문제에 적혀있는 곱하기 표시는 코드에 적을 수 없으므로 '*'표시로 바꿔주어야 한다.11. 곱셈
문제 URL : 곱셈
문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.
출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
예제 입력 1
472
385
예제 출력 1
2360
3776
1416
181720
1234567891011121314# 첫째 자리a = int(input())# 둘째 자리b = int(input())# a * b의 1의 자리수print( a * ((b%100)%10) )# a * b의 10의 자리수print( a * ((b%100)//10) )# a * b의 100의 자리수print( a * (b // 100) )# 최종 답print( a*b )cs
꽤나 재미있는 문제였다.
사람의 계산 방식을 알고리즘으로 짜본 건 이번이 처음이다.
이 문제에서의 포인트는 나머지 연산('%')이다.12# a * b의 1의 자리수print( a * ((b%100)%10) )cs - a * ((b%100)%10)
나머지 연산 부분에 집중할 필요가 있다.
b%100은 b를 100으로 나눈 나머지, 즉 100의 자리수를 뺀 나머지 10과 1의 자리수가 나온다.
그리고 그 뒤에 있는 %10은 10의 자리수를 뺀 나머지 수가 나오게 되는 것이다.이것이 수에서 1의 자리수만 분리하는 방법이다.
12# a * b의 10의 자리수print( a * ((b%100)//10) )cs 위의 상황과 거의 비슷한데, 맨 뒤에 있는 식이 조금 다르다.
이번에는 나머지 연산 대신 몫을 구하는 //를 사용했다.b%100으로 100의 자리수를 제거한 상태에서 다시 10으로 나눈 몫을 구하게 되면 10의 자리수만 가져올 수 있기 때문이다.
이 방법이 아니더라도, 나머지 연산을 연속적으로 사용해서 10의 자리수를 가져올 수도 있다.- (b%100) - ((b%100)%10)
이렇게.
하지만 나는 식을 최대한 짧게 만들고 싶어서 이 방법 대신 몫을 이용하는 방법을 택했다.12# a * b의 100의 자리수print( a * (b // 100) )cs 100의 자리수는 정말 간단하다.
- b // 100
b를 100으로 나눈 몫을 가져오는 건데, 이렇게 하면 100의 자리수를 바로 가져올 수 있다.
12# 최종 답print( a*b )cs 마지막 부분은 그냥 결과값을 출력하는 코드이다.
근데 이런식으로 결과를 출력하는 건 문제 의도와는 맞지 않는 거 같다.
출제자의 의도는,- c = a * (b의 1의 자리수)
- d = a * (b의 10의 자리수)
- e = a * (b의 100의 자리수)
이런식으로 변수를 3개 만든 다음.
c+d+e의 결과를 출력하기를 원했던 거 같다.
어찌됐든 결과는 동일하기 때문에 백준 사이트에서는 정답으로 인정됐다!
코드를 다시 작성하기 귀찮아서 수정하지 않고 나뒀지만,이 글을 보는 다른 분들은 출제 의도에 맞게 풀어보시는 걸 권장한다.
마치며.
블로그 소개(?) 인사(?) 포스팅 이후 처음으로 올린 글이다.
앞으로 이렇게 알고리즘 문제풀이 과정을 블로그에 기록해두려고 한다.
일단은 백준 사이트의 '단계별 문제풀이'부터 포스팅을 시작했는데,
양도 너무 많고, 그리 재미도 없어서 이걸 계속 할지는 모르겠다.
이런 것보다는 프로그래머스에 있는 코딩 테스트 문제들을 푸는 게 더 재미있고 공부가 될 거 같은데...
포스팅을 올리기 시작했으니 백준 '단계별 문제풀이'도 꾸준히 올려보도록 하겠다.
오늘 풀어본 문제들은 단계별 중에서도 가장 쉬운 1단계였다.
'단계별 문제풀이'는 한 포스팅당 한 단계씩 진행하려고 한다.
그럼, 앞으로도 내가 꾸준히 포스팅을 할 수 있길 바라며.
오늘 포스팅은 여기서 마무리'알고리즘&자료구조(Algorithm&Data Structure)' 카테고리의 다른 글
[프로그래머스 문제풀이] 완주하지 못한 선수 - (1) (0) 2021.05.22