# 행을 체크하는 리스트
# 열을 체크하는 리스트
# 그룹을 체크하는 리스트를 만들어서 확인
'''
ch = [0] * 10
ch1 행
ch2 얄
ch3 그룹
ch[a[i][j]] = 1
sum(ch) != 9
잘못된 스토쿠임
'''
def check(tmp):
for i in range(9):
ch1 = [0] * 10
ch2 = [0] * 10
for j in range(9):
ch1[a[i][j]] = 1
ch2[a[j][i]] = 1
if sum(ch1) != 9 or sum(ch2) != 9:
return False
for i in range(3):
for j in range(3):
ch3 = [0] * 10
for k in range(3):
for s in range(3):
ch3[a[i*3 + k][j*3 + s]] = 1
if sum(ch3) != 9:
return False
return True
a = [list(map(int, input().split())) for _ in range(9)]
if check(a):
print('YES')
else:
print('NO')
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다. 각 격자 판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요. 격자의 가장자리는 0으로 초기화 되었다고 가정합니다. 만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
▣ 입력설명 첫 줄에 자연수 N이 주어진다.(1<=N<=50) 두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는 다.
n = int(input()) # 정수 n 입력 및 할당
a = [list(map(int, input().split())) for _ in range(n)] # 값들 입력 받아 배열 할당
a.insert(0, [0] * (n + 2)) # 맨 윗 줄에 0으로 된 행 넣기
a.append([0] * (n + 2)) # 맨 아랫 줄에도 0으로 된 행 넣기
for i in range(1, n+1): # 1부터 n까지 반복
a[i].insert(0, 0) # 각 행 첫 부분에 0 추가
a[i].append(0) # 각 행 끝 부분에 0 추가
cnt = 0 # 봉우리 갯수 세기 위한 cnt 할당
for j in range(1, n+1): # 1부터 n까지 반복
for k in range(1, n+1): # 이중반복문
p = a[j][k] # 봉우리 검사를 위한 p 할당
if p > a[j][k+1] and p > a[j][k-1] and p > a[j+1][k] and p > a[j-1][k]: # p를 상하좌우랑 비교했을 때 모두 큰 값이면
cnt += 1 # cnt를 1만큼 증가
print(cnt) # 계산을 통해 얻은 봉우리 갯수 출력
다른 사람 풀이
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
a.insert(0, 0 * n)
a.append([0] * n)
for x in a:
x.insert(0, 0)
x.append(0)
cnt = 0
for i in range(1, n+1):
for j in range(1, n+1):
if all(a[i][j] > a[i+dx[k]][j+dy[k]] for k in range(4)):
cnt += 1
print(cnt)
현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있습니다. 현수의 마당은 N*N 격자판으 로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정합니다. 그런데 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다. 그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다. 만약 회전명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 아래 그림처럼 회전시키는 명령 입니다.
첫 번째 수는 행번호, 두 번째 수는 방향인데 0이면 왼쪽, 1이면 오른쪽이고, 세 번째 수는 회전하는 격자의 수입니다. M개의 회전명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는 감이 총 몇 개가 있는지 출력하는 프로그램을 작성하세요.
▣ 입력설명 첫 줄에 자연수 N(3<=N<=20) 이 주어며, N은 홀수입니다. 두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어집니다. 이 자연수는 각 격자안에 있는 감의 개수이며, 각 격자안의 감의 개수는 100을 넘지 않습니다. 그 다음 줄에 회전명령의 개수인 M(1<=M<=10)이 주어지고, 그 다음 줄부터 M개의 회전명령 정보가 M줄에 걸쳐 주어집니다.
'''
예를 들어, 2 0 3
0 1 2 3 4
3 4 0 1 2
3 -> 3 - 3 = 0
4 -> 4 - 3 = 0
2 -> 2 - 3 = -1 -> 4 == len() + (2 - 3)
1 -> 1 - 3 = -2 -> 3 == len() + (1 - 3)
0 -> 0 - 3 = -3 -> 2 == len() + (0 - 3)
한편, 2 1 3
0 1 2 3 4
2 3 4 0 1
0 -> 0 + 3 = 3
1 -> 1 + 3 = 4
2 -> 2 + 3 = 5 -> 1 = 5 - 4
3 -> 3 + 3 = 6 -> 2 = 6 - 4
4 -> 4 + 3 = 7 -> 3 = 7 - 4
'''
# 입력: 첫 줄 - N, 둘 째줄부터 N째줄까지 자연수 N개, 이후 M, M줄의 회전 명령
# 출력: 총 감의 개수
n = int(input()) # 정수 n 입력 및 할당
array = [] # 빈 array 할당
for i in range(n): # n만큼 반복
array.append(list(map(int,input().split()))) # array에 숫자 입력하여 추가
m = int(input()) # 정수 m 입력 및 할당
for i in range(m): # m만큼 반복
a, b, c = map(int, input().split()) # a, b, c 입력 및 할당
if b == 0: # b가 0이면 왼쪽으로 회전
for _ in range(c): # c만큼 반복
array[a-1].append(array[a-1][0]) # 제일 왼쪽의 숫자를 제일 오른쪽에 추가
array[a-1].pop(0) # 제일 왼쪽의 숫자 pop()으로 제거
else: # b가 1이면 오른쪽으로 회전
for _ in range(c): # c만큼 반복
array[a-1].insert(0, array[a-1][-1]) # 제일 오른쪽의 숫자를 제일 왼쪽에 추가
array[a-1].pop() # 제일 오른쪽의 숫자 pop()으로 제거
s = 0 # 시작 포인터: 0으로 할당
e = n # 끝 포인터: n으로 할당 (슬라이싱을 위해 n-1이 아닌, n)
sum_result = 0 # 합을 담을 sum_result 변수 0으로 할당
for j in range(n): # n만큼 반복
sum_result += sum(array[j][s:e]) # 해당 조건의 슬라이싱된 리스트의 합을 sum_result에 더해줌
if j < n // 2: # 절반을 기준으로 위에 있는 행들의 경우,
s += 1 # s는 1씩 커지고
e -= 1 # e는 1씩 작아짐
else: # 절반을 기준으로 밑에 있는 행들의 경우,
s -= 1 # s는 1씩 작아지고
e += 1 # e는 1씩 커짐
print(sum_result) # 합 출력
다른 사람 풀이
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
m = int(input())
for i in range(m):
h, t, k = map(int, input().split())
if t == 0:
for _ in range(k):
a[h-1].append(a[h-1].pop(0))
else:
for _ in range(k):
a[h-1].insert(0, a[h-1].pop())
res = 0
s = 0
e = n - 1
for i in range(n):
for j in range(s, e+1):
res += a[i][j]
if i < n // 2:
s += 1
e -= 1
else:
s -= 1
e += 1
print(res)
현수의 농장은 N*N 격자판으로 이루어져 있으며, 각 격자안에는 한 그루의 사과나무가 심어저 있다. N의 크기는 항상 홀수이다. 가을이 되어 사과를 수확해야 하는데 현수는 격자판안의 사과를 수확할 때 다이아몬드 모양의 격자판만 수확하고 나머지 격자안의 사과는 새들을 위해서 남겨놓는다. 만약 N이 5이면 아래 그림과 같이 진한 부분의 사과를 수확한다.
현수과 수확하는 사과의 총 개수를 출력하세요.
▣ 입력설명 첫 줄에 자연수 N(홀수)이 주어진다.(3<=N<=20) 두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 이 자연수는 각 격자안에 있는 사과나무에 열린 사과의 개수이다. 각 격자안의 사과의 개수는 100을 넘지 않는다.
# 입력: 첫 줄 - N (홀수), 두 번째 줄부터 N번째 줄까지 N개의 자연수
# 출력: 수확한 총 사과 개수
'''
만약 7이면,
1 3 5 7 5 3 1
만약 9이면,
1 3 5 7 9 7 5 3 1
'''
n = int(input()) # 정수 n 입력 및 할당
array = [] # 빈 array 할당
list_s = [] # list_s 할당
for i in range(n): # n만큼 반복
array.append(list(map(int,input().split()))) # array에 각 행의 숫자 추가
for i in range(n): # n만큼 반복
if i <= int(n/2): # 위의 절반 줄의 경우에는
list_s.append(sum(array[i][int(n/2)-i:int(n/2)+1+i])) # 해당 조건만큼만 슬라이싱해서 더함
else: # 반대로 밑의 절반 줄의 경우에는
list_s.append(sum(array[i][int(n/2)-(n-i-1):int(n/2)+1+(n-i-1)])) # 해당 조건만큼만 슬라이싱해서 더함
print(sum(list_s)) # 합을 구하여 출력
다른 사람 풀이
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
res = 0
s = e = n // 2
for i in range(n):
for j in range(s, e + 1):
res += a[i][j]
if i < n // 2:
s -= 1
e += 1
else:
s += 1
e -= 1
print(res)
n = int(input())
board = []
for _ in range(n):
tmp = list(map(int, input().split()))
board.append(tmp)
max_sum = 0
# 가로 합 구해서 최댓값과 비교
for i in board:
if sum(i) > max_sum:
max_sum = sum(i)
# 세로 합 구해서 최댓값과 비교
for j in range(n):
tmp = 0
for k in range(n):
tmp += board[k][j]
if tmp > max_sum:
max_sum = tmp
# 정방향 대각선 합 구해서 최댓값과 비교
tmp2 = 0
for l in range(n):
tmp2 += board[l][l]
if tmp2 > max_sum:
max_sum = tmp2
# 역방향 대각선 합 구해서 최댓값과 비교
tmp3 = 0
for m in range(n):
tmp3 += board[m][n-1-m]
if tmp3 > max_sum:
max_sum = tmp3
print(max_sum)
풀이 2
# 앞의 풀이와 크게 다르지 않음
# 입력: 첫 줄 - N, 두 번째부터 N번째까지 N개의 자연수
# 출력: 최대합 출력
n = int(input()) # 정수 n 입력 및 할당
array = [] # 숫자를 담을 빈 array 할당
list_s = [] # 합을 담을 list_s 할당
for i in range(n): # n만큼 반복
array.append(list(map(int,input().split()))) # 숫자 list로 변환하여 2차원 배열에 담기
for i in array: # array 요소만큼 반복
list_s.append(sum(i)) # 각 행의 합 구하여 list_s에 추가
for i in range(n): # i 만큼 반복
tmp = 0 # 요소 값을 더할 tmp 할당
for j in range(n): # 이중반복문
tmp += array[j][i] # 각 열의 합 구하기
list_s.append(tmp) # list_s에 추가
i = 0
tmp2 = 0
tmp3 = 0
while i < n: # i가 n보다 크지 않을 때 무한 반복
tmp2 += array[i][i] # tmp2에는 정방향 대각선 합 구하기
tmp3 += array[n-1-i][i] # tmp3에는 역방향 대각선 합 구하기
i += 1
else:
list_s.append(tmp2) # list_s에 추가
list_s.append(tmp3) # list_s에 추가
print(max(list_s)) # list_s의 최댓값 출력
다른 사람 풀이
# 정수 n 입력 및 할당
n = int(input())
# 한 번에 2차원 배열로 만들기
a=[list(map(int, input().split())) for _ in range(n)]
# 가장 작은 값으로 최댓값 할당
largest = -2147000000
# 행과 열 합 구하기
for i in range(n):
sum1 = sum2 = 0
for j in range(n):
sum1 += a[i][j] # 행을 쭉 합하는 것
sum2 += a[j][i] # 열을 쭉 합하는 것
if sum1 > largest:
largest = sum1
if sum2 > largest:
largest = sum2
# 대각선 합 구하기
sum1 = sum2 = 0
for i in range(n):
sum1 += a[i][i]
sum2 += a[i][n-i-1]
if sum1 > largest:
largest = sum1
if sum2 > largest:
largest = sum2
print(largest)
# 입력: 첫째 줄 - N, M, 둘째 줄 - 수열 나열
# 출력: 합이 M이 되는 경우의 수 출력
n, m = map(int, input().split())
list_n = list(map(int, input().split()))
a = 0
for i in range(n):
for j in range(i+1, n+1):
if sum(list_n[i:j]) == m:
a += 1
print(a)
다른 사람 풀이
# 연속적인 부분 수열의 합이 m과 같은 경우 출력
# 포인터 각각 할당 lt, rt
n, m = map(int, input().split())
a = list(map(int, input().split()))
lt = 0 # 포인터 lt 할당
rt = 1 # 포인터 rt 할당
tot = a[0] # tot 초기값: a[0]
cnt = 0 # 개수 세기 위한 cnt 할당
while True: # break 되기 전까지 반복
if tot < m: # 합이 m보다 작을 경우
if rt < n: # rt가 n보다 작을 경우
tot += a[rt] # tot에 a[rt] 값 더해줌
rt += 1 # rt 포인터 1만큼 증가
else: # rt가 n보다 크거나 같으면
break # 반복문 종료
elif tot == m: # 만약 합이 m과 같으면
cnt += 1 # cnt 1 증가
tot -= a[lt] # tot에서 a[lt] 값 빼줌
lt += 1 # lt 1 증가
else: # 만약 합이 m보다 크면
tot -= a[lt] # cnt 증가 없이 a[lt] 값 빼줌
lt += 1 # lt 1 증가
print(cnt) # cnt 출력
오름차순으로 정렬이 된 두 리스트가 주어지면 두 리스트를 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.
▣ 입력설명 첫 번째 줄에 첫 번째 리스트의 크기 N(1<=N<=100)이 주어집니다. 두 번째 줄에 N개의 리스트 원소가 오름차순으로 주어집니다. 세 번째 줄에 두 번째 리스트의 크기 M(1<=M<=100)이 주어집니다. 네 번째 줄에 M개의 리스트 원소가 오름차순으로 주어집니다. 각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.
# 입력: N, N개의 리스트 원소, M, M개의 리스트 원소
# 출력: 오름차순으로 정렬된 리스트 출력
n = int(input()) # 정수 n 할당
list_n = list(map(int, input().split())) # 리스트 list_n 입력 및 할당
m = int(input()) # 정수 m 할당
list_m = list(map(int, input().split())) # 리스트 list_m 입력 및 할당
sum = [*list_n, *list_m] # 두 리스트 언패킹하여 다시 리스트로 묶어줌
sum = sorted(sum) # sorted()를 통해 오름차순 정렬
print(*sum, sep = ' ') # 언패킹하여 공백 하나 기준으로 값들 출력
다른 사람 풀이
# sort() 함수는 시간복잡도가 nlogn
# 이를 n으로 줄이는 방법
n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
p1 = p2 = 0
c = []
while p1 < n and p2 < m:
if a[p1] <= b[p2]:
c.append(a[p1])
p1 += 1
else:
c.append(b[p2])
p2 += 1
if p1 < n:
c = c + a[p1:]
if p2 < m:
c = c + b[p2:]
for x in c:
print(x, end = ' ')
# 입력: 10개의 줄에 걸쳐, 한 줄에 하나씩 10개의 구간 ai, bi
# 출력: 마지막 카드들의 배치를 한 줄에 출력
# 예를 들어, 5부터 10까지 슬라이싱해서 역순으로 만들려면
# card[10-1:5-2:-1]
# 첫 번째는 포함하기 때문에 인덱스의 -1 차만 빼면 됨
# 두 번째는 포함하지 않기 때문에 인덱스의 -1 차와 -1을 추가로 빼줘야 함
# 그리고 추가로 그 앞 뒤에 있는 인덱스는 그대로 가지고 가면 될 것 같음
# 그렇게 해서 다시 리스트 세 개를 합쳐주면 될 것 같음
card = '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20'.split()
i = 0
while i < 10:
i += 1
a, b = map(int, input().split())
if a >= 2: # a가 2보다 크거나 같을 때,
tmp = [card[:a-1], card[b-1:a-2:-1], card[b:]] # 임시 리스트에 바뀐 순서대로 저장
card = sum(tmp, []) # 초기값을 []로 줘서, 리스트끼리 더하기가 가능하게 함
else: # a가 1일 때,
tmp = [card[b-1::-1], card[b:]]
card = sum(tmp, [])
else:
print(*card, sep = ' ') # 리스트 압축 풀고, 공백으로 구분해서 출력
다른 사람 풀이
a = list(range(21)) # 자동으로 0부터 20까지 리스트가 생김
for _ in range(10): # i 대신 _를 적게 되면 변수 없이 범위만큼 반복하게 됨
s, e = map(int, input().split())
for i in range((e-s+1)//2):
a[s+i], a[e-i] = a[e-i], a[s+i]
a.pop(0)
for x in a:
print(x, end = ' ')
문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다. 만들어진 자연수와 그 자연수의 약수 개수를 출력합니다. 만약 “t0e0a1c2h0er”에서 숫자만 추출하면 0, 0, 1, 2, 0이고 이것을 자연수를 만들면 120이 됩니다. 즉 첫 자리 0은 자연수화 할 때 무시합니다. 출력은 120를 출력하고, 다음 줄에 120 의 약수의 개수를 출력하면 됩니다. 추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.
▣ 입력설명 첫 줄에 숫자가 썩인 문자열이 주어집니다. 문자열의 길이는 50을 넘지 않습니다.
# 입력: 문자열 주어짐
# 출력: 첫째 줄 - 자연수 출력; 둘째 줄 - 약수의 개수 출력
from math import sqrt
numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
w = input() # 문자열 w 입력 및 할당
w = list(w) # 문자열 리스트로 변환
a = [] # 숫자만 담을 빈 리스트 a 할당
for i in w: # 리스트 w의 각 요소 반복
if i in numbers: # i가 numbers 안의 요소에 해당한다면
a.append(i) # 이를 a에 추가
a = int(''.join(a)) # join()을 통해 각 요소를 묶어 정수형으로 변환
cnt = 0 # 개수 세기 위한 cnt 할당
for i in range(1, a + 1): # a만큼 반복
if a % i == 0: # a가 i로 나눠진다면 = 약수
cnt += 1 # cnt 1 추가
print(a) # a 출력
print(cnt) # 약수의 개수 cnt 출력
다른 사람 풀이
s = input()
res = 0
for x in s:
if x.isdecimal():
res = res * 10 + int(x)
print(res)
cnt = 0
for i in range(1, res + 1):
if res % i == 0:
cnt += 1
print(cnt)