문제
다음과 같은 조건 하에서 사재기를 하여 최대한의 이득을 얻도록 도와주자.
1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
3. 판매는 얼마든지 할 수 있다.
예를 들어 3일 동안의 매매가가 1, 2, 3 이라면 처음 두 날에 원료를 구매하여 마지막 날에 팔면 3의 이익을 얻을 수 있다.
코드
T = int(input()) # 테스트 케이스의 수
for test_case in range(1, T+1):
N = int(input()) # N일 동안 물건 매매가 예측함
price = list(map(int, input().split())) # 매매가
max_price = price[-1] # N번째가 최댓값
answer = 0
# 최댓값과 N-1부터 0까지 비교
for i in range(N-1, -1, -1):
if price[i] >= max_price: # 최댓값보다 크거나 같으면 최댓값으로 바꾸기
max_price = price[i]
else:
answer += (max_price - price[i])
print("#%d %d" %(test_case, answer))
풀이
문제
1. 숫자 1부터 순서대로 차례대로 말하되, “3” “6” “9” 가 들어가 있는 수는 말하지 않는다.
1 2 3 4 5 6 7 8 9…
2. "3" "6" "9"가 들어가 있는 수를 말하지 않는대신, 박수를 친다. 이 때, 박수는 해당 숫자가 들어간 개수만큼 쳐야 한다.
예를 들어 숫자 35의 경우 박수 한 번, 숫자 36의 경우 박수를 두번 쳐야 한다.
입력으로 정수 N 이 주어졌을 때, 1~N 까지의 숫자를
게임 규칙에 맞게 출력하는 프로그램을 작성하라.
박수를 치는 부분은 숫자 대신, 박수 횟수에 맞게 “-“ 를 출력한다.
여기서 주의해야 할 것은 박수 한 번 칠 때는 - 이며, 박수를 두 번 칠 때는 - - 가 아닌 -- 이다.
코드
T = int(input())
result = ''
for i in range(1, T+1): # 1부터 입력 숫자까지 반복
N = str(i)
N_cnt = 0
# 3, 6, 9 개수 찾기
if '3' in N :
N_cnt += N.count('3')
if '6' in N :
N_cnt += N.count('6')
if '9' in N :
N_cnt += N.count('9')
if N_cnt == 0:
result += N
else:
for j in range(N_cnt): # 3,6,9 개수만큼 - 출력
result += '-'
result += ' ' # 문자열에 공백 추가
print(result)
풀이
문제
패턴에서 반복되는 부분을 마디라고 부른다.
문자열을 입력 받아 마디의 길이를 출력하는 프로그램을 작성하라.
코드
T = int(input()) # 테스트 케이스 개수
for test_case in range(1, T+1):
data = input()
for i in range(1,10): # 문자열 길이 30 (마디 최대길이 10)
if data[ : i] == data[i : i*2]:
# print(data[:i]) 문자열 확인
print("#%d %d" %(test_case, i))
break
풀이
마디 최대 길이가 10이기 때문에 최대 0~9과 10~19 비교하여 같으면 출력
ex) KOREA의 경우
1. i=1이면 K와 O 비교 (0번, 1번)
2. i=2이면 KO와 RE 비교 (0~1번, 2~3번)
3. i=3이면 KOR와 EAK 비교 (0~2번, 3~5번)
4. i=4이면 KORE와 AKOR 비교 (0~3번, 4~7번)
5. i=5이면 KOREA와 KOREA 비교 (0~4번, 5~9번)
6. 문자열 KOREA 찾고, i는 마디 길이
문제
숫자 N은 아래와 같다.
N=2a x 3b x 5c x 7d x 11e
N이 주어질 때 a, b, c, d, e 를 출력하라.
코드
T = int(input()) # 테스트 케이스의 개수
for test_case in range(1, T+1):
data = int(input())
a = 0; b = 0; c = 0; d = 0; e = 0
while(data != 1):
if data % 2 == 0:
a += 1
data /= 2
elif data % 3 == 0:
b += 1
data /= 3
elif data % 5 == 0:
c += 1
data /= 5
elif data % 7 == 0:
d += 1
data /= 7
elif data % 11 == 0:
e += 1
data /= 11
print("#{} {} {} {} {} {}".format(test_case, a, b, c, d, e))
풀이
문제
다음과 같이 Encoding 을 한다.
1. 우선 24비트 버퍼에 위쪽(MSB)부터 한 byte씩 3 byte의 문자를 집어넣는다.
2. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 [표-1] 의 문자로 Encoding 한다.
입력으로 Base64 Encoding 된 String 이 주어졌을 때, 해당 String 을 Decoding 하여, 원문을 출력하는 프로그램을 작성하시오.
코드
T = int(input())
decode = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/']
for test_case in range(1, T+1):
data = input() # 글자 입력
bi_data = ''
answer = ''
for i in range(len(data)):
num = decode.index(data[i]) # 입력 글자를 표에 따라 숫자로 변환
bi_num = str(bin(num)[2:]) # 숫자를 이진수로 변환 (0b 제거)
while len(bi_num) < 6: # 6비트씩 잘라 인코딩 하는데
bi_num = '0' + bi_num # 1일 경우 이진수로 바꾸면 1로 나와서 (000001로 만드는 과정)
bi_data += bi_num
for j in range(len(data)*6//8):
num2 = int(bi_data[j*8:j*8+8],2) #8비트씩 잘라 10진수 변환
answer += chr(num2) # 아스키코드로 변환
print("#{} {}".format(test_case, answer))
풀이
1) Base64 라이브러리 사용
2) 라이브러리X
문제
1부터 N까지의 숫자에서 홀수는 더하고 짝수는 뺐을 때 최종 누적된 값을 구해보자.
[예제 풀이]
N이 5일 경우,
1 – 2 + 3 – 4 + 5 = 3
N이 6일 경우,
1 – 2 + 3 – 4 + 5 – 6 = -3
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input())
answer = 0
for i in range(1, N+1):
if i%2 == 0: # 짝수일 경우
answer -= i
else: # 홀수일 경우
answer += i
print ("#{} {}".format(test_case, answer))
풀이
문제
민석이는 1번 양부터 순서대로 세는 것이 재미없을 것 같아서 N의 배수 번호인 양을 세기로 하였다.
즉, 첫 번째에는 N번 양을 세고, 두 번째에는 2N번 양, … , k번째에는 kN번 양을 센다.
이전에 셌던 번호들의 각 자리수에서 0에서 9까지의 모든 숫자를 보는 것은 최소 몇 번 양을 센 시점일까?
예를 들어 N = 1295이라고 하자.
첫 번째로 N = 1295번 양을 센다. 현재 본 숫자는 1, 2, 5, 9이다.
두 번째로 2N = 2590번 양을 센다. 현재 본 숫자는 0, 2, 5, 9이다.
현재까지 본 숫자는 0, 1, 2, 5, 9이다.
세 번째로 3N = 3885번 양을 센다. 현재 본 숫자는 3, 5, 8이다.
현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.
네 번째로 4N = 5180번 양을 센다. 현재 본 숫자는 0, 1, 5, 8이다.
현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.
다섯 번째로 5N = 6475번 양을 센다. 현재 본 숫자는 4, 5, 6, 7이다.
현재까지 본 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9이다.
5N번 양을 세면 0에서 9까지 모든 숫자를 보게 되므로 민석이는 양 세기를 멈춘다.
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input()) # N의 배수 번호
num = []
count = 0
N_num = N # N의 배수 담을 변수
while(len(num) != 10): # 집합에 0~9까지 들어가면 총 10이 됨
count += 1 # 몇 번째
N_num = N * count
for i in str(N_num):
if i in num:
continue
else:
num.append(i)
num.sort()
print("#{} {}".format(test_case, N*count))
풀이
문제
두 회사 중 더 적게 수도 요금을 부담해도 되는 회사를 고르려고 한다.
A사 : 1리터당 P원의 돈을 내야 한다.
B사 : 기본 요금이 Q원이고, 월간 사용량이 R리터 이하인 경우 요금은 기본 요금만 청구된다. 하지만 R 리터보다 많은 양을 사용한 경우 초과량에 대해 1리터당 S원의 요금을 더 내야 한다.
종민이의 집에서 한 달간 사용하는 수도의 양이 W리터라고 할 때, 요금이 더 저렴한 회사를 골라 그 요금을 출력하는 프로그램을 작성하라.
코드
T = int(input())
for test_case in range(1, T+1):
P, Q, R, S, W = map(int, input().split())
# P : 1L당 요금
# Q : R리터 이하 요금 (기본요금)
# S : 추가 1L당 요금
# W : 한 달간 사용하는 수도의 양
answer = 0
if(R < W):
W_A = P * W
W_B = Q + (W-R) * S
else:
W_A = P * W
W_B = Q
if W_A > W_B:
answer = W_B
else:
answer = W_A
print("#{} {}".format(test_case, answer))
풀이
문제
"level" 과 같이 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.
단어를 입력 받아 회문이면 1을 출력하고, 아니라면 0을 출력하는 프로그램을 작성하라.
코드
for test_case in range(1, T+1):
data = input().replace(' ', '') # 공백 제거
answer = 0; ans = 0
for i in range(len(data)//2):
if(data == data[::-1]): # 문자열과 거꾸로 문자열 만든 것과 같은지 비교
answer = 1
else:
answer = 0
print("#{} {}".format(test_case, answer))
풀이
문제
N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.
주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.
코드
T = int(input())
for test_case in range(1, T+1):
N, K = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
# N = 단어 퍼즐의 가로, 세로 길이 (5<=N<=15)
# K = 단어의 길이 (2<=K<=N)
answer = 0
cnt = 0
for i in range(N):
# 행 검사
for j in range(N):
if arr[i][j] == 1:
cnt += 1
if arr[i][j] == 0 or j == N-1: # 0을 만났을 때 cnt 초기화
if cnt == K: # 한 행이 끝날 때 cnt값이 K이면 answer += 1
answer += 1
cnt = 0
# 열 검사
for j in range(N):
if arr[j][i] == 1:
cnt += 1
if arr[j][i] == 0 or j == N-1: # 0을 만났을 때 cnt 초기화 (11001도 k=3일 경우 1이 됨)
if cnt == K: # 한 열이 끝날 때 cnt값이 K이면 answer += 1
answer += 1
cnt = 0
print("#{} {}".format(test_case, answer))
풀이
문제
코드
T = int(input())
for test_case in range(1, T+1):
N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
answer = 0
if N == M:
for i in range(N):
answer += A[i] * B[i]
else:
if N > M: # 기본은 예시처럼 M > N 인 경우임
N, M = M, N
A, B = B, A
for i in range(M-N+1): # B
max = 0
for j in range(N): # A
max += A[j] * B[j+i]
if max > answer:
answer = max
print("#{} {}".format(test_case, answer))
풀이
문제
월 일로 이루어진 날짜를 2개 입력 받아, 두 번째 날짜가 첫 번째 날짜의 며칠째인지 출력하는 프로그램을 작성하라.
코드
T = int(input())
month = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30, 7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
for test_case in range(1, T+1):
date = list(map(int, input().split()))
answer = 0
if date[0] == date[2]:
answer = date[3] - date[1] + 1
else:
answer += month[int(date[0])]-int(date[1]) + 1 # 시작 월의 날짜 계산
answer += int(date[3]) # 끝 월의 날짜 계산
for i in range(date[0]+1, date[2]): # 사이 월의 날짜 계산
answer += month[int(i)]
print("#{} {}".format(test_case, answer))
풀이
문제
RC (Radio Control) 카의 이동거리를 계산하려고 한다.
입력으로 매 초마다 아래와 같은 command 가 정수로 주어진다.
0 : 현재 속도 유지.
1 : 가속
2 : 감속
위 command 중, 가속(1) 또는 감속(2) 의 경우 가속도의 값이 추가로 주어진다.
가속도의 단위는, m/s2 이며, 모두 양의 정수로 주어진다.
입력으로 주어진 N 개의 command 를 모두 수행했을 때, N 초 동안 이동한 거리를 계산하는 프로그램을 작성하라.
RC 카의 초기 속도는 0 m/s 이다.
코드
for test_case in range(1, T+1):
N = int(input()) # Command의 수
answer = 0 # 카의 이동 거리
num = 0 # 현재 RC카의 속도
# Command + 가속도의 값
# 0 : 현재 속도 유지.
# 1 : 가속
# 2 : 감속
for i in range(N):
com = list(map(int, input().split()))
if com[0] == 1:
num += com[1]
elif com[0]== 2:
num -= com[1]
if num >= 0:
answer += num
else: # 속도가 음수일 경우 속도 0으로 유지
num = 0
print("#{} {}".format(test_case, answer))
풀이
문제
주어진 N 길이의 숫자열을 오름차순으로 정렬하여 출력하라.
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input())
data = list(map(int, input().split()))
answer = ''
data.sort() # 데이터 정렬
for i in data:
answer += str(i)
answer += ' '
print("#{} {}".format(test_case, answer))
풀이
문제
N x N 행렬이 주어질 때,
시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input()) # N X N 행렬
arr = [list(map(int, input().split())) for _ in range(N)]
answer = []
# 90, 180, 270 회전할 배열 초기화
arr_90 = [ [0 for _ in range(N)] for _ in range(N)] # N X N 행렬
arr_180 = [ [0 for _ in range(N)] for _ in range(N)]
arr_270 = [ [0 for _ in range(N)] for _ in range(N)]
# arr 행렬 90도 회전
for i in range(N):
for j in range(N):
arr_90[i][j] = arr[N-1-j][i]
# arr 행렬 180도 회전
for i in range(N):
for j in range(N):
arr_180[i][j] = arr_90[N-1-j][i] # 90도 행렬을 90도 회전
# arr 행렬 270도 회전
for i in range(N):
for j in range(N):
arr_270[i][j] = arr_180[N-1-j][i] # 180도 행렬을 90도 회전
print("#{} ".format(test_case))
for i in range(N):
for a in range(N):
print(arr_90[i][a], end='')
print(end=" ")
for b in range(N):
print(arr_180[i][b], end='')
print(end=" ")
for c in range(N):
print(arr_270[i][c], end='')
print( )
풀이
문제
달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.
다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input()) # 달팽이 크기
arr = [[0 for _ in range(N)] for _ in range(N)] # 달팽이 숫자 배열
stock = 0 # cycle 마다 축적된 sum의 값
for i in range(N//2): # 짝수는 딱 떨어지고, 홀수는 1번 부족하게
cycle = ((N-1)-2*i)
for j in range(cycle):
arr[i][i + j] = stock + j+1
arr[i + j][(N-1)-i] = stock + (cycle)+(j+1)
arr[(N-1)-i][(N-1)-(i + j)] = stock + 2*(cycle)+(j+1)
arr[(N-1)-(i + j)][i] = stock + 3*(cycle)+(j+1)
stock += 4 * cycle # 사이클 마지막 값을 다음 시작점에 더함
if N % 2 == 1: # 홀수일 경우
arr[N//2][N//2] = N**2 # NXN행렬 가운데에 N의 제곱 저장
print(f'#{test_case}')
for lines in range(len(arr)): # 각 라인 출력
print(*arr[lines])
풀이
[참고] https://velog.io/@datamarksman/SWEA-1954.-%EB%8B%AC%ED%8C%BD%EC%9D%B4%EC%88%AB%EC%9E%90
swea [S/W 문제해결 기본] 1일차 - 최빈수 구하기
문제
1000명의 수학 성적을 토대로 최빈수를 출력하는 프로그램을 작성하여라.
다음과 같은 수 분포가 있으면,
10, 8, 7, 2, 2, 4, 8, 8, 8, 9, 5, 5, 3
최빈수는 8이 된다.
(단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라)
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input()) # 테스트 케이스 번호
score = list(map(int, input().split())) # 1000개의 점수
data = [0] * 1001
answer = []
for i in score: # 각 숫자가 몇개 있는지 저장하는 배열
data[i] += 1
val = max(data) # 가장 많이 있는 숫자의 최대 개수
for j in range(len(data)): # 가장 많이 있는 숫자가 뭔지 찾기
if data[j] == val:
answer.append(j)
print("#{} {}".format(N, max(answer)))
풀이
문제
코드
T = int(input())
for test_case in range(1, T+1):
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
# N = NXN 배열의 크기
# M = MXM 파리채의 크기
num_max = [] # 파리 갯수 최댓값
for i in range(N-M+1): # 0부터 N-M까지 확인
for j in range(N-M+1): # M 개수만큼 더하기
num = 0 # 파리 갯수 합
for a in range(M): # 파리채 박스안의 값 더하기
for b in range(M):
num += arr[i+a][j+b]
num_max.append(num)
answer = max(num_max)
print("#{} {}".format(test_case, answer))
풀이
문제
코드
T = int(input())
for test_case in range(1, T+1):
sudoku = [list(map(int, input().split())) for _ in range(9)] # 스도쿠는 9 X 9 배열
answer = 1
for i in range(9):
arr1 = [0] * 10 # 세로 확인 배열
arr2 = [0] * 10 # 가로 확인 배열
for j in range(9):
arr1[sudoku[j][i]] += 1 # 세로 배열 확인
arr2[sudoku[i][j]] += 1 # 가로 배열 확인
for k in range(1, 10):
if arr1[k] != 1:
answer = 0
break
if arr2[k] != 1:
answer = 0
break
for i in range(0, 9, 3):
for j in range(0, 9, 3):
arr3 = [0] * 10 # 3X3 확인 배열
for a in range(3):
for b in range(3):
arr3[sudoku[i+a][j+b]] += 1 # 3X3 배열 확인
for k in range(1,10):
if arr3[k] != 1:
answer = 0
break
print("#{} {}".format(test_case, answer))
풀이
문제
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input())
arr = [[0]*N for _ in range(N)]
for i in range(N):
for j in range(i+1):
if j==0 or j==i:
arr[i][j] = 1
else:
arr[i][j] = arr[i-1][j]+arr[i-1][j-1]
print("#{} ".format(test_case))
for line in arr:
answer = [x for x in line if x] # 0 제외하고 출력
print(*answer) # [] 제외하고 출력
풀이
문제
시 분으로 이루어진 시각을 2개 입력 받아, 더한 값을 시 분으로 출력하는 프로그램을 작성하라.
(시각은 12시간제로 표시한다. 즉, 시가 가질 수 있는 값은 1시부터 12시이다.)
코드
T = int(input())
for test_case in range(1, T+1):
h1, m1, h2, m2 = map(int, input().split())
hour = h1 + h2
min = m1 + m2
if min >= 60:
hour += 1
min -= 60
if hour > 12:
hour -= 12
print("#{} {} {}".format(test_case, hour, min))
풀이
문제
우리나라 화폐 ‘원’은 금액이 높은 돈을 우선적으로 계산할 때 돈의 개수가 가장 최소가 된다.
S마켓에서 사용하는 돈의 종류는 다음과 같다.
50,000 원
10,000 원
5,000 원
1,000 원
500 원
100 원
50 원
10 원
S마켓에서 손님에게 거슬러 주어야 할 금액 N이 입력되면 돈의 최소 개수로 거슬러 주기 위하여 각 종류의 돈이 몇 개씩 필요한지 출력하라.
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input()) # 손님에게 거슬러 줘야 할 금액
money = [50000, 10000, 5000, 1000, 500, 100, 50, 10]
answer = [0] * 8
for i in range(8):
if N // money[i] != 0:
answer[i] = N //money[i]
N = N % money[i]
print("#{}".format(test_case))
print(*answer)
풀이
문제
코드
T = int(input())
score = ['A+', 'A0', 'A-', 'B+', 'B0', 'B-', 'C+' ,'C0' ,'C-' ,'D0']
for test_case in range(1, T+1):
N, K = map(int, input().split()) # N = 학생수, K = 학점을 알고싶은 학생의 번호
data = []
sum_abc = 0
for i in range(N):
a, b, c = map(int, input().split())
sum_abc = a*0.35 + b*0.45 + c*0.20
data.append(sum_abc)
K_value = data[K-1]
data.sort(reverse=True) # 역순으로 정렬 (큰게 앞으로)
value = N // 10 # 10보다 클 경우 동일한 평점
answer = data.index(K_value) // value
print("#{} {}".format(test_case, score[answer]))
풀이
문제
원본 문서는 너비가 10인 여러 줄의 문자열로 이루어져 있다.
문자열은 마지막 줄을 제외하고 빈 공간 없이 알파벳으로 채워져 있고 마지막 줄은 왼쪽부터 채워져 있다.
이 문서를 압축한 문서는 알파벳과 그 알파벳의 연속된 개수로 이루어진 쌍들이 나열되어 있다. (예 : A 5 AAAAA)
코드
T = int(input())
for test_case in range(1, T+1):
N = int(input())
result = []
for i in range(N):
data, count = input().split()
for j in range(int(count)):
result.append(data)
print("#{}".format(test_case))
for i in range(len(result)):
if (i+1) % 10 == 0:
print(result[i])
else:
print(result[i], end='')
print()
풀이
문제
10개의 수를 입력 받아, 최대 수와 최소 수를 제외한 나머지의 평균값을 출력하는 프로그램을 작성하라.
(소수점 첫째 자리에서 반올림한 정수를 출력한다.)
코드
T = int(input())
for test_case in range(1, T+1):
data = list(map(int, input().split()))
num = 0 # 나머지 수 모두 더한 합
data.sort() # 정렬
for i in range(1,9): # 최대 수와 최소 수 제외
num += data[i]
answer = round(num/8)
print("#{} {}".format(test_case, answer))
풀이