Coding Test/백준(Python)
[백준/Python] 2116번(구현, 브루트포스)_주사위 쌓기
syunze
2023. 9. 5. 21:11
📌문제 유형
구현, 브루트포스 (골드 Lv.5)
📌문제
2116번: 주사위 쌓기
첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는
www.acmicpc.net
📌나의 문제풀이
- 너무 무지성 코드
- 1개의 주사위별로 마주보는 숫자 짝지어서 넣기
- 한 줄씩 비교해가며 맞닿아있는 숫자 꼬리물기
- 숫자 보면서 큰 숫자 ans에 더하기
n = int(input())
# 1개의 주사위별로 마주보는 숫자 짝지어서 넣기
dices = []
dices_set = []
for _ in range(n):
dice = list(map(int,input().split()))
dices.append(dice)
# 마주보는 것 짝지어서 넣기
set_ = []
set_.append((dice[0], dice[5]))
set_.append((dice[5], dice[0]))
set_.append((dice[1], dice[3]))
set_.append((dice[3], dice[1]))
set_.append((dice[2], dice[4]))
set_.append((dice[4], dice[2]))
dices_set.append(set_)
# 한 줄씩 비교해가며 맞닿아있는 숫자 꼬리물기
rules = []
for k in range(6):
next = dices_set[0][k]
rule = [next]
for j in range(n-1):
for i in range(6): #열의 개수
if next[1] == dices_set[j+1][i][0]:
next = dices_set[j+1][i]
rule.append(next)
break
rules.append(rule)
# num1,2 둘 다 6이 아닌 경우, 6 더하기
# (6,5)인 경우는 4 더하기 / (6,4) 아래 = 5 더하기
result = 0
for l in range(6):
ans = 0
for num1, num2 in rules[l]:
if num1 != 6 and num2 != 6:
ans += 6
elif num1 == 6:
if num2 == 5:
ans += 4
else:
ans += 5
elif num2 == 6:
if num1 == 5:
ans += 4
else:
ans += 5
if result < ans:
result = ans
print(result)
📌 다른사람의 문제풀이
- 인덱스 접근 방법
[알고리즘][파이썬] 백준 2116번 - 주사위 쌓기
백준 2116번 문제 리뷰
velog.io
N = int(input())
dice = []
for _ in range(N):
dice.append(list(map(int, input().split())))
rotate = {0 : 5, 1 : 3, 2 : 4, 3 : 1, 4 : 2, 5 : 0} # 주사위의 아랫면에 따른 윗면 로테이션 등록(리스트 인덱스 기준)
maxnum = 0 # 최대값을 저장해둘 상수 선언
for i in range(6): # 첫 번째 주사위를 기준으로 1~6까지 모두 순회
result = [] #각 주사위마다 옆면의 최대값 1개를 저장해둘 리스트 선언
temp = [1, 2, 3, 4, 5, 6] # 주사위 각 면에 써져있는 1~6
temp.remove(dice[0][i]) # 주사위 아랫면의 숫자 제거
next = dice[0][rotate[i]] # 첫 번째 주사위의 윗면 값 계산
temp.remove(next) # 첫 번째 주사위의 윗면 값 삭제
result.append(max(temp)) # 첫 번째 주사위의 옆면들 중 가장 큰 값 삽입
for j in range(1, N): # 두 번째 주사위부터 마지막 주사위까지 반복
temp = [1, 2, 3, 4, 5, 6]
temp.remove(next) # 현재 주사위의 아랫면 숫자 제거
next = dice[j][rotate[dice[j].index(next)]] # 현재 주사위의 윗면 계산
temp.remove(next) # 현재 주사위의 윗면 삭제
result.append(max(temp)) # 현재 주사위의 옆면들 중 가장 큰 값 삽입
result = sum(result) # 각 주사위마다의 최대값을 모두 더한다.
if maxnum < result: # 이전의 최대값과 현재의 최대값을 비교하여 더 큰 값을 저장한다.
maxnum = result
print(maxnum)
📌 리뷰
- 정말 인덱스가 계속 헷갈리는 문제....
- (처음에 나도 다른 사람 문제풀이처럼 접근하다가 인덱스가 계속 헷갈려서 지금 방법으로 풀었다.)
- 인덱스 짝지어서 바뀔때에는 딕셔너리 사용하기!
728x90