티스토리 뷰

PS

[Swift/Python] 백준_톱니바퀴(14891)

희철 2023. 3. 13. 17:40

문제

 

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

 

풀이

 

구현만 하면 되는 문제였음.

 

아예 왼쪽으로 돌리는 함수, 오른쪽으로 돌리는 함수, 톱니바퀴가 돌아가면 같이 돌아가는 톱니바퀴를 반환하는 함수, 톱니바퀴가 돌아갈때 돌아갈 방향을 반환하는 함수를 전부 구현하였다.

 

Swift

import Foundation

//var input: [[String]] = []
//for _ in 0..<3 {
//    input.append(readLine()!.map { String($0) })
//}
//var count = Int(readLine()!)!
var input = [["1","0","0","1","0","0","1","1"],
             ["0","1","0","1","0","0","1","1"],
             ["1","1","1","0","0","0","1","1"],
             ["0","1","0","1","0","1","0","1"]]
//var count = 8
//var data: [[Int]] = []
var data = [[1,1],[2,1],[3,1],[4,1],[1,-1],[2,-1],[3,-1],[4,-1]]
private func changeLeft(_ gear: [String], _ num: Int) {
    print("left로 바꾸기 이전: \(gear)")
    var new = gear
    let first = new[0]
    for i in 0..<gear.count - 1 {
        new[i] = new[i + 1]
    }
    new[7] = first
    print("left 이후: \(new)")
    input[num] = new
}
private func changeRight(_ gear: [String], _ num: Int){
    print("right 이전: \(gear)")
    var new = gear
    let last = new[7]
    for i in stride(from: 7, through: 1, by: -1) {
        new[i] = new[i - 1]
    }
    new[0] = last
    print("right 이후: \(new)")
    input[num] = new
}
private func getGearDir(_ first: Int, _ dir: Int) -> [Int] {
    if first % 2 == 0 {
        return [-dir,dir,-dir,dir]
    } else {
        return [dir,-dir,dir,-dir]
    }
}
private func getChangingGear(_ first: Int) -> [Int] {
    if first == 1 {
        //두번째꺼확인하면됨
        if input[0][2] == input[1][6] {
            //같으면 안돌아감 여기서 끝
            return [1]
        } else {
            //다르면 다시 두번째꺼랑 세번째꺼 비교해야함
            if input[1][2] == input[2][6] {
                return [1,2]
            } else {
                if input[2][2] == input[3][6] {
                    return [1,2,3]
                } else {
                    return [1,2,3,4]
                }
            }
        }
    } else if first == 2 {
        if input[0][2] == input[1][6] {
            if input[1][2] == input[2][6] {
                return [2]
            } else {
                if input[2][2] == input[3][6] {
                    return [2,3]
                } else {
                    return [2,3,4]
                }
            }
        } else {
            if input[1][2] == input[2][6] {
                return [1,2]
            } else {
                if input[2][2] == input[3][6] {
                    return [1,2,3]
                } else {
                    return [1,2,3,4]
                }
            }
        }
    } else if first == 3 {
        if input[2][2] == input[3][6] {
            if input[1][2] == input[2][6] {
                return [3]
            } else {
                if input[0][2] == input[1][6] {
                    return [2,3]
                } else {
                    return [1,2,3]
                }
            }
        } else {
            if input[1][2] == input[2][6] {
                return [3,4]
            } else {
                if input[0][2] == input[1][6] {
                    return [2,3,4]
                } else {
                    return [1,2,3,4]
                }
            }
         }
    } else {
        //두번째꺼확인하면됨
        if input[2][2] == input[3][6] {
            //같으면 안돌아감 여기서 끝
            return [4]
        } else {
            //다르면 다시 두번째꺼랑 세번째꺼 비교해야함
            if input[1][2] == input[2][6] {
                return [3,4]
            } else {
                if input[0][2] == input[1][6] {
                    return [2,3,4]
                } else {
                    return [1,2,3,4]
                }
            }
        }
    }
}
//for _ in 0..<count {
//    data.append(readLine()!.split(separator: " ").map { Int(String($0))! })
//}
for i in 0..<data.count {
    let cur = data[i]
    let dir = getGearDir(cur[0],cur[1]) //방향
    let gears = getChangingGear(cur[0]) //바뀌는 기어들
    print(cur, dir, gears)
    for gear in gears {
        print("현재 바퀴: \(gear)")
        if dir[gear - 1] == 1 {
            changeRight(input[gear-1], gear - 1)
        } else {
            changeLeft(input[gear-1], gear - 1)
        }
    }
    print("=================바뀐 후")
    print(input)
    print("========================")
}
var result = 0
for i in 0..<4 {
    if input[i][0] == "1" {
        switch i {
            case 0:
            result += 1
            case 1:
            result += 2
            case 2:
            result += 4
            default:
            result += 8
        }
    }
}
print(result)

 

Python

gears = []
datas = []
for _ in range(4):
    gears.append(input())
k = int(input())
for _ in range(k):
    datas.append(list(map(int,input().split())))

def getChangingGears(num):
    if num == 1:
        if gears[0][2] == gears[1][6]:
            return [1]
        else:
            if gears[1][2] == gears[2][6]:
                return [1,2]
            else:
                if gears[2][2] == gears[3][6]:
                    return [1,2,3]
                else:
                    return [1,2,3,4]
    elif num == 2:
        if gears[0][2] == gears[1][6]:
            if gears[1][2] == gears[2][6]:
                return [2]
            else:
                if gears[2][2] == gears[3][6]:
                    return [2,3]
                else:
                    return [2,3,4]
        else:
            if gears[1][2] == gears[2][6]:
                return [1,2]
            else:
                if gears[2][2] == gears[3][6]:
                    return [1,2,3]
                else:
                    return [1,2,3,4]
    elif num == 3:
        if gears[2][2] == gears[3][6]:
            if gears[1][2] == gears[2][6]:
                return [3]
            else:
                if gears[0][2] == gears[1][6]:
                    return [2,3]
                else:
                    return [1,2,3]
        else:
            if gears[1][2] == gears[2][6]:
                return [3,4]
            else:
                if gears[0][2] == gears[1][6]:
                    return [2,3,4]
                else:
                    return [1,2,3,4]
    else:
        if gears[2][2] == gears[3][6]:
            return [4]
        else:
            if gears[1][2] == gears[2][6]:
                return [3,4]
            else:
                if gears[0][2] == gears[1][6]:
                    return [2,3,4]
                else:
                    return [1,2,3,4]

def changeLeft(gear, gearNum):
    new = list(gear)
    first = new[0]
    for i in range(len(new) - 1):
        new[i] = new[i + 1]
    new[7] = first
    gears[gearNum] = ''.join(new)
def changeRight(gear,gearNum):
    new = list(gear)
    last = new[7]
    for i in range(7,0,-1):
        new[i] = new[i - 1]
    new[0] = last
    gears[gearNum] = ''.join(new)
def getGearDir(gearNum, dir):
    if gearNum % 2 == 0:
        return [-dir,dir,-dir,dir]
    else:
        return [dir,-dir,dir,-dir]

for i in range(len(datas)):
    tempDir = getGearDir(datas[i][0],datas[i][1])
    tempGears = getChangingGears(datas[i][0])
    for gear in tempGears:
        if tempDir[gear - 1] == 1:
            changeRight(gears[gear - 1], gear - 1)
        else:
            changeLeft(gears[gear - 1], gear - 1)
result = 0
for i in range(4):
    if gears[i][0] == "1":
        if i == 0:
            result += 1
        elif i == 1:
            result += 2
        elif i == 2:
            result += 4
        else:
            result += 8
print(result)

 

 

_____________________________________________________________________________________________________

 

 

파이썬 문법때문에 오래걸림..

댓글
최근에 올라온 글
Total
Today
Yesterday