데이터사이언스 기록기📚

[백준/Python] 2116번(구현, 브루트포스)_주사위 쌓기 본문

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
Comments