Ssa!
백준 알고리즘 단계별)반복문 본문
https://www.acmicpc.net/problem/2739
| 문제 |
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.
|
| 입력 |
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.
|
| 출력 |
출력형식과 같게 N*1부터 N*9까지 출력한다.
|
| 답 | numbers = int(input()) fix= [1, 2, 3, 4, 5, 6, 7, 8, 9] for i in range(len(fix)): new_fix = list(map(int, fix)) print(f'{numbers} * {new_fix[i]} = {numbers * new_fix[i]}') |
간단한 구구단 ! 고정값을 두고 입력 받은 값을 구구단 시키는 것이다. 저렇게 한번 써보고 복습하려고 다시 써봤는데 다른 형식으로 나와서 놀랬다.
n = int(input())
for i in range(1, 10):
print(f'{n} * {i} = {n * i}')
내가 작성한 코드라도 모든 문제를 다 기억할 수 없기에 간단하게 작성할 수 있다는 것을 알았다. 변수를 간단하게 썼고 i 값으로 구구단을 돌렸다. 조금씩 내가 성장하고 있다는 느낌을 받았다. 매우 뿌듯했다.
https://www.acmicpc.net/problem/10950
| 문제 |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
|
| 입력 | 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10) |
| 출력 |
각 테스트 케이스마다 A+B를 출력한다.
|
| 답 | loup = int(input()) for i in range(loup): a, b=map(int, input().split()) print(a + b ) |
for 문에 대한 값을 돌려 더하기 출력하는 문제였다. 간단하다!
https://www.acmicpc.net/problem/8393
| 문제 |
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
|
| 입력 |
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.
|
| 출력 |
1부터 n까지 합을 출력한다.
|
| 답 | n = int(input()) sum = 0 for i in range(1, n+1): sum += i print(sum) |
새로운 사실을 알게되었다 range값을 (1, n+1)까지 범위를 정하여 쓸 수 있다! 매번 알고리즘 문제를 풀 때 마다 모르는 개념을 하나씩 알게될 수 있어서 좋다.
https://www.acmicpc.net/problem/25304
| 문제 | 준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다. 영수증에 적힌,
|
| 입력 | 첫째 줄에는 영수증에 적힌 총 금액 X가 주어진다. 둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다. 이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다. |
| 출력 | 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다. |
| 답 | X = int(input()) N = int(input()) c = 0 for i in range(N): a, b = map(int, input().split()) c = c + (a * b) if X == c: print("Yes") else: print("No") |
처음으로 for문을 돌려 입력 받은 다음 if문을 쓰는 문제였다! 조건식과 반복문을 혼합하여 쓸 수 있다는 것이 좋았다!
https://www.acmicpc.net/problem/15552
| 문제 | 본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다. 또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다. |
| 입력 |
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
|
| 출력 |
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
|
| 답 | import sys number = int(sys.stdin.readline()) for n in range(number): a, b =map(int, sys.stdin.readline().split()) print(a + b) |
이 문제에서 처음으로 시간초과라는 것을 알았고 입력값에 따른 함수마다 메모리가 처리하는 시간이 다르다는 것을 알았다. 당분간은 sys를 쓰겠지만 sys는 뒤에 자동으로 개행문자가 붙어서 불편한 감이 없잖아 있다. . . 물론 그러기 위해서 restrip() 을 써주면 되겠지만 말이다
https://www.acmicpc.net/problem/11021
| 문제 |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
|
| 입력 | 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. |
| 출력 |
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.
|
| 답 | import sys n = int(sys.stdin.readline()) for i in range (1, n+1): a, b= map(int, sys.stdin.readline().split()) print(f'Case #{i}: {a+b}') |
f string을 써서 값을 넣어 최소한으로 줄였다!
https://www.acmicpc.net/problem/11022
| 문제 |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
|
| 입력 | 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. |
| 출력 |
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.
|
| 답 | import sys n = int(sys.stdin.readline()) for i in range(1, n+1): a, b= map(int, sys.stdin.readline().split()) print(f'Case #{i}: {a} + {b} = {a+b}') |
위 문제와 별 다른 것이 없었다!
https://www.acmicpc.net/problem/2438
| 문제 |
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
|
| 입력 | 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다. |
| 출력 |
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
|
| 답 | n = int(input()) for i in range(1, n+1): print('*' * i) |
내가 백준 알고리즘 푼 문제들 중에서 가장 내가 좋아하는 문제이다.
*를 찍는게 얼마나 아름다운 것인가??? 이런 문제가 더 있는지 찾아봤다.
https://blog.naver.com/nkj2001/222698193629
파이썬#56 - 파이썬 별표찍기, for 문 활용법 여러가지 별찍기
프로그래밍을 어느정도 접하고 익숙해진 사람들에겐 if 문이나 for 문이나 사실 특별할게 없는 문법들입니...
blog.naver.com
for문을 완벽하게 마스터하려면 파이썬의 별표찍기 만한것 만큼은 없다고 적혀있어서 나중에 직접 해봐야겠다!!!!!!!!
https://www.acmicpc.net/problem/2439
| 문제 | 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오. |
| 입력 |
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
|
| 출력 |
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
|
| 답 | import sys a = int(sys.stdin.readline()) for i in range(1, a+1): print(" " * (a - i), end="") print('*' * i) |
반대로 직각삼각형을 만들기 위해서는 일단 출력값에 보면 공백이 있고 별표가 있다 공백을 먼저작성을 해주고 해당 값에서 i 만큼 빼준 다음 end로 뒤에 출력값과 붙이면 완벽해진다!!!
https://www.acmicpc.net/problem/10871
| 문제 |
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
|
| 입력 | 첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다. |
| 출력 |
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
|
| 답 | n, x=map(int, input().split()) a = list(map(int, input().split())) for i in range(n): if a[i] < x: print(a[i]) |
두번 째의 for문과 if 문의 조합이였다!
https://www.acmicpc.net/problem/10952
| 문제 |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
|
| 입력 | 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10) 입력의 마지막에는 0 두 개가 들어온다. |
| 출력 |
각 테스트 케이스마다 A+B를 출력한다.
|
| 답 | while True: a, b = map(int, input().split()) if a == b == 0: break else: print(a+b) |
파이썬 기초문법에서 while에 관한 문법을 배우지 않았는데 이 알고리즘을 통해 새로운 문법을 알게되었다.
while문의 동작방식과 활용법을 알게되었다!
https://www.acmicpc.net/problem/10951
| 문제 |
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
|
| 입력 | 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10) |
| 출력 |
각 테스트 케이스마다 A+B를 출력한다.
|
| 답 | while True: try: a, b= map(int, input().split()) print(a + b) except: break |
처음에 while문을 사용한다는 것은 알았지만 try와 except문을 쓴다는 것을 생각도 하지않은 것이 화근이였다. . .
while문을 break 시킬 수단을 할 수 없어 컴퓨터 cpu가 터질려는 그런 상황이 왔었다 ㅋㅋㅋㅋ
다양한 함수의 조합을 쓸 수 있다는 것이 아직은 익숙하지는 않다.
https://www.acmicpc.net/problem/1110
| 문제 | 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자. 26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다. 위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다. N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오. |
| 입력 |
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.
|
| 출력 |
첫째 줄에 N의 사이클 길이를 출력한다.
|
| 답 | n = int(input()) # 68 number = n cnt = 0 while True: a = number // 10 # 6 b = number % 10 # 8 c = (a+b) % 10 number = (10*b) + c cnt +=1 if number == n: print(cnt) break |
어려운 문제다...!!!!몇번이나 고민해서 풀어봤다. 못풀어서 해설도 보았지만 이해가 한번에 가지 않았다.
여러번 복습을 하고 드디어 어느정도 그림을 그려 이해가 갔다.

앞으로 어려운 문제는 그림으로 이렇게 작성하여 흐름을 기억할 것 같다. 다음에 보면 풀 수 있도록 흐름을 기억하는게 최선의 방법이다!
'CS > 알고리즘' 카테고리의 다른 글
| 백준 알고리즘 단계별)기초수학 (0) | 2022.09.14 |
|---|---|
| 백준 알고리즘 단계별)문자열 (1) | 2022.09.13 |
| 백준 알고리즘 단계별)함수 (0) | 2022.09.08 |
| 백준 알고리즘 단계별)1차원 배열 (0) | 2022.09.06 |
| 백준 알고리즘 단계별)조건문 (1) | 2022.09.02 |