Python

    [14499] 주사위 굴리기 - Python

    [14499] 주사위 굴리기 - Python

    /* 문제 */ 크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다. 지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여..

    [1475] 방 번호 - Python

    [1475] 방 번호 - Python

    /* 문제 */ 다솜이는 은진이의 옆집에 새로 이사왔다. 다솜이는 자기 방 번호를 예쁜 플라스틱 숫자로 문에 붙이려고 한다. 다솜이의 옆집에서는 플라스틱 숫자를 한 세트로 판다. 한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다. 다솜이의 방 번호가 주어졌을 때, 필요한 세트의 개수의 최솟값을 출력하시오. (6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용할 수 있다.) 구현 문제다. 이 문제의 포인트는 6과 9를 서로 뒤집어서 사용할 수 있다는 것이다. 즉 한 세트만 있어도 6 두 개, 9 두 개, 혹은 6 한 개와 9 한 개를 만들 수 있다. 방 번호에 중복된 숫자가 있다면 새로운 세트가 필요하다. 따라서 각 숫자의 총 개수를 세고 6과 9만 따로 처리했다. 내가 생각한 방법은 6 6..

    [13305] 주유소 - Python

    [13305] 주유소 - Python

    /* 문제 */ 어떤 나라에 N개의 도시가 있다. 이 도시들은 일직선 도로 위에 있다. 편의상 일직선을 수평 방향으로 두자. 제일 왼쪽의 도시에서 제일 오른쪽의 도시로 자동차를 이용하여 이동하려고 한다. 인접한 두 도시 사이의 도로들은 서로 길이가 다를 수 있다. 도로 길이의 단위는 km를 사용한다. 처음 출발할 때 자동차에는 기름이 없어서 주유소에서 기름을 넣고 출발하여야 한다. 기름통의 크기는 무제한이어서 얼마든지 많은 기름을 넣을 수 있다. 도로를 이용하여 이동할 때 1km마다 1리터의 기름을 사용한다. 각 도시에는 단 하나의 주유소가 있으며, 도시 마다 주유소의 리터당 가격은 다를 수 있다. 가격의 단위는 원을 사용한다. 예를 들어, 이 나라에 다음 그림처럼 4개의 도시가 있다고 하자. 원 안에 ..

    [1541] 잃어버린 괄호 - Python

    [1541] 잃어버린 괄호 - Python

    /* 문제 */ 세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다. 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다. 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오. 식의 값을 최소로 만들려면 빼는 값을 크게 만들면 된다. 따라서 마이너스부터 다음 마이너스 전까지 모두 괄호로 묶어 더한 후 빼준다. # 정답 코드 exp = input().split('-') res = sum(map(int, exp.pop(0).split('+'))) for str in exp: res -= sum(map(int, str.split('+'))) print(res) 숫자가 0으로 시작할 수 있지만 int형으로 변환하면 ..

    [11399] ATM - Python

    [11399] ATM - Python

    /* 문제 */ 인하은행에는 ATM이 1대밖에 없다. 지금 이 ATM앞에 N명의 사람들이 줄을 서있다. 사람은 1번부터 N번까지 번호가 매겨져 있으며, i번 사람이 돈을 인출하는데 걸리는 시간은 Pi분이다. 사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라지게 된다. 예를 들어, 총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필..

    [1931] 회의실 배정 - Python

    [1931] 회의실 배정 - Python

    /* 문제 */ 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 그리디 문제로 한 번의 실패 후 성공했다. 처음에는 회의 시간이 짧은 순서대로 정렬힌 후 가장 짧은 회의부터 회의실을 사용하도록 했다. 짧은 시간의 회의를 최대한 많이 포함해야 회의의 최대로 많이 할 수 있다고 생각했기 때문이다. #..

    [11047] 동전 0 - Python

    [11047] 동전 0 - Python

    /* 문제 */ 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. 그리디 알고리즘을 대표하는 '거스름돈' 문제와 비슷한 문제다. 이 문제를 그리디 알고리즘으로 풀 수 있는 이유는 문제의 조건이 다음과 같기 때문이다. 동전의 가치를 Ai라 할 때 Ai 는 Ai-1의 배수 큰 단위의 동전은 항상 작은 단위의 동전의 배수이다. 즉 작은 단위의 동전으로 만들 수 있는 값은 항상 그것보다 적은 수의 큰 단위 동전을 포함해 만들어낼 수 있다. 따라서 무조건 큰 단위의 동전을 최대한 많이 사용하는 것이 최적의 해가 된다. # 정답 코드 n,k = map(int,..

    [11053] 가장 긴 증가하는 부분 수열 - Python

    [11053] 가장 긴 증가하는 부분 수열 - Python

    /* 문제 */ 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. dp문제다. dp 리스트의 각 요소에는 해당 수열 값까지 최대로 이어질 수 있는 수열의 길이를 저장한다. 예를 들어 A = {10,20,10,30,20,50}인 경우에는 dp가 [1,2,1,3,2,4]일 것이다. dp의 첫 번째 요소를 1로 설정하고(앞에 다른 수가 없으므로 수열의 길이는 무조건 1) 반복문으로 dp의 인덱스를 1부터 돌며 최대 길이를 계산한다. 반복문에서는 계산 중인 수열의 값보다 작은 값들을 모은 후 ..