#1979. 어디에 단어가 들어갈 수 있을까
N X N 크기의 단어 퍼즐을 만들려고 한다. 입력으로 단어 퍼즐의 모양이 주어진다.
주어진 퍼즐 모양에서 특정 길이 K를 갖는 단어가 들어갈 수 있는 자리의 수를 출력하는 프로그램을 작성하라.
t = int(input())
for tc in range(1, t+1):
n, k = map(int, input().split())
# 퍼즐 모양을 2차원 배열로 입력받음
arr = [list(map(int, input().split())) for _ in range(n)]
result = 0
# 퍼즐의 각 행을 검사
for i in range(n):
sum = 0 # 연속된 1의 개수를 세기 위한 변수 초기화
# 가로
for j in range(n):
if arr[i][j] == 1:
sum += 1 # 연속된 1의 개수 증가
if arr[i][j] == 0 or j == n - 1:
# 연속된 1의 개수가 k와 같으면 단어갈 들어갈 수 있는 자리로 간주
if sum == k:
result += 1
# 연속된 1의 개수 초기화
sum = 0
# 세로(열)을 검사
for i in range(n):
sum = 0
# 세로
for j in range(n):
if arr[j][i] == 1:
sum += 1
if arr[j][i] == 0 or j == n - 1:
# 연속된 1의 개수가 k와 같으면 단어가 들어갈 수 있는 자리로 간주
if sum == k:
result += 1
#연속된 1의 개수 초기화
sum = 0
print('#{} {}'.format(tc, result))
#1976. 시각 덧셈
시 분으로 이루어진 시각을 2개 입력 받아, 더한 값을 시 분으로 출력하는 프로그램을 작성하라.
(시각은 12시간제로 표시한다. 즉, 시가 가질 수 있는 값은 1시부터 12시이다.)
풀이1) 경우의 수 나눠서 계산
T = int(input())
for tc in range(1, T+1):
f_hour, f_min, s_hour, s_min = map(int,input().split())
sum_min = f_min + s_min
sum_hour = f_hour + s_hour
#조건1 : 60분 이상, 13시 이상
if sum_min >= 60 and sum_hour >= 13:
sum_hour -= 11 # +1-12
sum_min -= 60
print('#{} {} {}'.format(tc, sum_hour, sum_min))
#조건2 : 60분 이상, 13시 미만
elif sum_min >= 60 and sum_hour < 13:
sum_hour += 1
sum_min -= 60
print('#{} {} {}'.format(tc, sum_hour, sum_min))
#조건3 : 60분 미만, 13시 이상
elif sum_min < 60 and sum_hour >= 13:
sum_hour -= 12
print('#{} {} {}'.format(tc, sum_hour, sum_min))
#조건4 : 60분 미만, 13시 미만
else:
print('#{} {} {}'.format(tc, sum_hour, sum_min))
풀이2) 몫과 나머지로 계산
T = int(input())
for tc in range(1, T+1):
f_hour, f_min, s_hour, s_min = map(int,input().split())
sum_min = f_min + s_min
sum_hour = f_hour + s_hour + (sum_min // 60)
sum_min = sum_min % 60
if sum_hour > 12:
sum_hour -= 12
print('#{} {} {}'.format(tc, sum_hour, sum_min))
#1974. 스도쿠 검증
스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.
같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.
입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
아이디어 : 처음에 1~9까지의 숫자 합이 45인거를 이용하여 문제를 풀었지만, 3*3의 유효성을 검사하기에는 어려움을 겪어서 (테스트 케이스 5개 맞음ㅠ) 다른 사람 코드를 보고 풀어보았다.
T = int(input())
for tc in range(1, T+1):
# 9*9 크기의 스도쿠 퍼즐을 입력받음
arr = [list(map(int,input().split())) for _ in range(9)]
# 유효성 검사 ( 1: 유효, 0: 유효X)
result = 1
# 가로, 세로 검사
for i in range(9):
cnt_row = [0] * 10 #행 카운트 리스트
cnt_col = [0] * 10 #행 카운트 리스트
for j in range(9):
cnt_row[arr[i][j]] += 1 #행 숫자 카운트
cnt_col[arr[j][i]] += 1 #열 숫자 카운트
# 중복 체크
for x in range(1,10): # 1부터 9까지의 숫자에 대해 검사
if cnt_row[x] != 1: #행에서 중복된 숫자가 있는 경우
result = 0
break
if cnt_col[x] != 1: #열에서 중복된 숫자가 있는 경우
result = 0
break
# 3*3 격자 검사
for i in range(3): #3*3 격자의 행 시작점(0,3,6)
for j in range(3): #3*3 격자의 열 시작점(0,3,6_
cnt_x = [0] * 10 # 3*3격자의 숫자 카운트를 위한 리스트
for x in range(3): # 3*3 격자의 행 인덱스(0,1,2)
for y in range(3): # 3*3 격자의 열 인덱스(0,1,2)
cnt_x[arr[3*i+x][3*j+y]] += 1 #3*3 격자의 숫자 카운트 증가
for x in range(1,10): #1부터 9까지의 숫자에 대해 검사
if cnt_x[x] != 1: # 3*3격자에 숫자가 한 번만 등장하지 않으면
result = 0 # 유효하지 않음으로 설정
break
# 결과 출력
print('#{} {}'.format(tc, result))
#1970. 쉬운 거스름돈
S마켓에서 손님에게 거슬러 주어야 할 금액 N이 입력되면 돈의 최소 개수로 거슬러 주기 위하여 각 종류의 돈이 몇 개씩 필요한지 출력하라.
아이디어 : 리스트에 각 거스름돈 카운트를 저장하여 출력한다.
T = int(input())
coin_types = [50000,10000,5000,1000,500,100,50,10]
for tc in range(1, T+1):
n = int(input())
result = [] # 결과를 저장할 리스트 초기화
# 각 화폐 단위에 대해 필요한 개수 계산
for coin in coin_types:
count = n // coin
result.append(count)
n %= coin
print('#{}'.format(tc))
for i in result:
print(i, end=' ')
print() # 결과 출력 후 다음줄에 n을 입력 받음
#1966. 숫자를 정렬하자
주어진 N 길이의 숫자열을 오름차순으로 정렬하여 출력하라.
T = int(input())
for tc in range(1, T+1):
n = int(input())
arr = list(map(int, input().split()))
arr.sort()
print('#{}'.format(tc), end=' ')
for i in arr:
print(i, end=' ')
print()
#1959. 두 개의 숫자열
서로 마주보는 숫자들을 곱한 뒤 모두 더할 때 최댓값을 구하라.
아이디어 : A가 B보다 클 경우 A,B를 swap하여 B가 항상 더 길도록 설정한다.
T = int(input())
for tc in range(1, T+1):
n,m = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
# B열의 길이가 더 짧을 경우, A와 B를 교환
if len(a) > len(b):
b,a = a,b
result = [] # 결과각ㅄ을 저장할 리스트 초기화
# 숫자열 B를 순회하며, A와 겹치는 부분에서의 곱의 합을 구함
for i in range(len(b) - len(a) + 1):
sum = 0
for j in range(len(a)):
sum += a[j] * b[i+j] # A와 B의 겹치는 부분에서의 숫자들을 곱
result.append(sum)
print('#{} {}'.format(tc, max(result)))
#1948. 날짜 계산기
월 일로 이루어진 날짜를 2개 입력 받아, 두 번째 날짜가 첫 번째 날짜의 며칠째인지 출력하는 프로그램을 작성하라.
아이디어 : 두 번째 날짜가 첫 번째 날짜보다 항상 크게 주어진다는 것이 포인트이다. 때문에 (날짜 - 날짜)를 계산하는 것과 (총 일수 - 총 일수)를 계산하는 결과값이 같으므로 좀 더 계산하기 쉬운 총 일수로 계산!
총일수 : 1월 1일부터 현재날짜까지의 총 일수
T = int(input())
days = [31,28,31,30,31,30,31,31,30,31,30,31] #1월부터 12월까지 일수
for tc in range(1, 1+T):
m1, d1, m2, d2 = map(int,input().split())
# 첫 번째 날짜까지의 총 일수 계산(1월 1일부터)
total_days_1 = sum(days[:m1-1]) + d1
# 두 번째 날짜까지의 총 일수 계산
total_days_2 = sum(days[:m2-1]) + d2
#차이를 계산항 첫 번째 날짜부터 두 번째 날짜까지의 총 일수를 구함
result = total_days_2 - total_days_1 + 1
print('#{} {}'.format(tc, result))
#1946. 간단한 압축 풀기
원본 문서는 너비가 10인 여러 줄의 문자열로 이루어져 있다.
문자열은 마지막 줄을 제외하고 빈 공간 없이 알파벳으로 채워져 있고 마지막 줄은 왼쪽부터 채워져 있다.
이 문서를 압축한 문서는 알파벳과 그 알파벳의 연속된 개수로 이루어진 쌍들이 나열되어 있다. (예 : A 5 AAAAA)
압축된 문서를 입력 받아 원본 문서를 만드는 프로그램을 작성하시오.
아이디어 : 리스트가 아닌 str로 저장하여 10개씩 끊어서 출력한다.
T = int(input())
for tc in range(1, T+1):
n = int(input()) # 압축된 문서의 라인 수를 입력받음
# 원본 문서를 저장할 변수 초기화
original_lines = ''
for _ in range(n): # 각 라인에 대해 반복
alpha, num = input().split()
# 해당 알파벳을 반복 횟수만큼 반복하여 원본문서에 추가함
original_lines += alpha * int(num)
#원본 문서를 너비 10으로 출력함
print('#{}'.format(tc))
# 0부터 원본 문서 끝까지 출력하는데 10단위로 끊어서 출력
for i in range(0, len(original_lines), 10):
print(original_lines[i:i+10])
'Study with Yedol > 코딩테스트 준비' 카테고리의 다른 글
[python3] SWEA D2 문제풀이 | 1859. 백만 장자 프로젝트 외 8문제 (0) | 2024.05.18 |
---|---|
[Python3] 백준 기본 문제 풀기 | 백준 14916 : 거스름돈 (0) | 2024.05.17 |
이코테 강의 몰아보기 | 7. 다이나믹 프로그래밍 (0) | 2024.05.13 |
이코테 강의 몰아보기 | 6. 다이나믹 프로그래밍 (0) | 2024.05.08 |
이코테 강의 몰아보기 | 5. 이진 탐색 (0) | 2024.05.07 |