Coding Test
[Section03] Python 알고리즘 문제풀이 09~11
mooni_
2024. 4. 1. 21:33
Q9. 봉우리 : N*N 격자판에서 자신의 숫자가 상하좌우의 수보다 큰 봉우리의 개수 찾기
입력 :
N(1<=N<=50)
N*N 격자판
출력 : 봉우리 개수
[내가 쓴 코드]
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
count = 0
a.insert(0, [0]*n) #첫 행 0으로 초기화
a.append([0]*n) #마지막 행 0으로 초기화
for x in a : #첫 열과 마지막 열 0으로 초기화
x.insert(0, 0)
x.append(0)
#여까지 강의보고 초기화 함!
for i in range(1, n + 1) :
for j in range(1, n + 1) :
if a[i][j] <= a[i][j+1] :
continue
elif a[i][j] <= a[i+1][j] :
continue
elif a[i][j] <= a[i][j-1] :
continue
elif a[i][j] <= a[i-1][j] :
continue
else :
count += 1
print(count)
#무작정 상하좌우 탐색함
[풀이 코드]
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
dx = [-1, 0, 1, 0] #해당 탐색 리스트를 사용할 것임
dy = [0, 1, 0, -1]
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)
dx, dy 활용하여 all로 한번에 탐색....... 파이썬 짱이네요
Q10. 스토쿠 검사 : 9*9 크기의 보드에서 스토쿠를 정확하게 풀었는지 체크
입력 : 완성된 9*9 스토쿠
출력 : YES | NO
[내가 쓴 코드]
a = [list(map(int, input().split())) for _ in range(9)] #스토쿠 입력받기
#index가 9개 생성될 수 있도록 아래 3가지 배열을 0으로 초기화
number_row = [0 for _ in range(9)] #행
number_col = [0 for _ in range(9)] #열
number = [0 for _ in range(9)] #3*3
check = False #한번이라도 중복되면 break 걸기 위한 플래그
for i in range(9) :
for j in range(9) :
number_row[a[i][j] - 1] += 1 #index를 활용하여 해당 수가 있으면 + 1
number_col[a[j][i] - 1] += 1
#3*3 사각형을 추출하여 검사하는 부분,,,,
if (i == 0 or i == 3 or i == 6) and (j == 0 or j == 3 or j == 6) :
for k in range(i, i + 3) :
for m in range(j, j + 3) :
number[a[k][m] - 1] += 1
if max(number) != 1 : #1이 아니라는 것은 중복된 수가 발생했다는 뜻
print("NO")
check = True
number = [0 for _ in range(9)] #초기화
break
number = [0 for _ in range(9)] #초기화
if check :
break
if max(number_row) != 1 or max(number_col) != 1 : #행과 열 검사
print("NO")
number_row = [0 for _ in range(9)]
number_col = [0 for _ in range(9)]
break
number_row = [0 for _ in range(9)]
number_col = [0 for _ in range(9)]
else : #for-else문 사용하여 break가 걸린 상황이 없다면 YES 출력
print("YES")
[풀이 코드]
def check(a) :
for i in range(9) :
ch1 = [0]*10 #행체크
ch2 = [0]*10 #열체크
for j in range(9) :
ch1[a[i][j]] = 1 #존재하는 숫자 인덱스에 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")
일단 너무너무 구림. 핑계를 대보자면 시간이 촉박했고,,, 아팠고,,,, 어쩌구,,,,
생성된 배열도 너무 많고 초기화 하는 부분도 구리고 반복문 조건문 구조도 깔끔하지 못 함
함수 써도 되는구나.... 그룹 탐색 방법과 숫자 체크하는 리스트에 1을 대입하는가와 +=1 한 것에 차이가 있음
Q11. 격자판 회문수 : 7*7 크기의 격자판에서 길이가 5인 회문수의 개수
입력 : 7*7 격자판
출력 : 회문수의 개수
[내가 쓴 코드]
a = [list(map(int, input().split())) for _ in range(7)] #격자판 입력받기
result = 0 #회문수의 개수
p = list() #대충 생성한 변수명
for i in range(7) : #행의 관점에서 회문수 찾기, 길이가 7이니 3번 체크하면 됨
for j in range(3) :
part = a[i][j:j + 5]
for k in range(2) :
if part[k] != part[-1 -k] : #회문수 아님
break
else :
result += 1
for i in range(7) : #열의 관점에서 찾기...
for j in range(3) :
for k in range(j, j + 5) :
p.append(a[k][i])
for m in range(2) :
if p[m] != p[-1 -m] :
p = []
break
else :
result += 1
p = []
print(result)
[풀이 코드]
board = [list(map(int, input().split())) for _ in range(7)]
cnt = 0
for i in range(3) :
for j in range(7) :
tmp = board[j][i:i+5]
if tmp == tmp[::-1] : #행의 관점에서 회문 검사
cnt += 1
for k in range(2) :
if board[i+k][j] != board[i+5-k-1][j] : #열의 관점에서 회문 검사
break
else :
cnt += 1
print(cnt)
다음 스터디는 더 성실하기...
*강의 : 파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)