no image
[BOJ] [Python] 1038번: 감소하는 수
https://www.acmicpc.net/problem/1038 1038번: 감소하는 수 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 www.acmicpc.net 문제 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다. 입력 더보기 첫째 줄에 N이..
2023.11.21
no image
[BOJ] [C++] 2309번: 일곱 난쟁이
https://www.acmicpc.net/problem/2309 문제 왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다. 아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오. 입력 더보기 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력..
2023.11.20
no image
[BOJ] [Python] 10419번: 지각
https://www.acmicpc.net/problem/10419 문제 창영이는 이번학기에 어떤 교양수업을 듣고 있다. 그런데, 그 교수님은 매우 지각을 자주 하시고 게다가 수업에 지각을 하였을 경우 수업을 일찍 마쳐 주기까지 하는 것을 발견하였다. 창영이는 교수님의 지각시간 0이상의 정수 t와 수업을 일찍 마쳐주는 시간 s 사이에 다음과 같은 관계가 있음을 알았다. $s = t^2$ 문득 창영이는 수업시간 d가 주어졌을 때, 교수님이 얼마나 지각을 할 수 있는지 궁금해졌고, 여러분은 창영이를 도와서 교수님이 지각할 수 있는 최대의 시간을 알아보자. 물론, 교수님이 도착하자마자 수업을 일찍 마쳐서 수업이 끝나는 것도 가능하다. 예를 들어, 수업시간이 6분인 경우, 교수님이 2분 지각을 하면, 4분간 수..
2023.11.20
no image
[BOJ] [Python] 9440번: 숫자더하기
https://www.acmicpc.net/problem/9440 9440번: 숫자 더하기 강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9 를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 2 www.acmicpc.net 문제 강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 207(78 + 129)이라고 생각했다. 그런데 선생님은 책 4페이지에 있는 비슷한 문제를 모두 풀어오라는 숙제를 내셨다. 작년부터 프로그래밍을 시작한 강민이는 이런 숙제보다..
2023.11.17
no image
[BOJ] [Python] 6593번 : 상범 빌딩
https://www.acmicpc.net/problem/6593 6593번: 상범 빌딩 당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 www.acmicpc.net 문제 더보기 당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그..
2023.11.16
no image
[BOJ] [Python] 11945번: 뜨거운 붕어빵
https://www.acmicpc.net/problem/11945 11945번: 뜨거운 붕어빵 입력으로 주어지는 각 행을 반전시켜서 출력하면 됩니다. 입력의 1행 1열은 출력의 1행 M열로, 입력의 1행 2열은 출력의 1행 M-1열로 … 입력의 1행 M열은 출력의 1행 1열로 … 입력의 N행 M열은 출력 www.acmicpc.net 문제 고려대학교에 입학한 새내기 호돌이는 안암역을 지나다가 한 붕어빵 장수를 만났어요. “안녕, 안녕, 안녕하십니까, 아저씨! 붕어빵 두 개 주세요.” “안녕을 세 번 외쳤으니 붕어빵 세 개!” 붕어빵 두 개의 값을 내고 세 개를 받은 호돌이는 기분이 좋았어요. 호돌이가 붕어빵 하나를 꺼내어 한 입 물었는데…. 너무 뜨거워서 그만 붕어빵을 떨어뜨리고 말았어요ㅠㅠ 붕어빵은 자..
2023.11.15
no image
[BOJ] [Python] 11727번: 2×n 타일링 2
https://www.acmicpc.net/problem/11727 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 문제 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 더보기 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 더보기 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 풀이방법 위와 같은 방식으로 일반식을 도출해낼 수 있다. 초기 값은 이러하다. $f(1) = 1..
2023.11.14
no image
[BOJ] [Python] 14916번: 거스름돈
https://www.acmicpc.net/problem/14916 14916번: 거스름돈 첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다. www.acmicpc.net 문제 춘향이는 편의점 카운터에서 일한다. 손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오. 예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다. 입력 더보기..
2023.11.14
no image
[BOJ] [Python] 17202번: 핸드폰 번호 궁합
https://www.acmicpc.net/problem/17202 17202번: 핸드폰 번호 궁합 어린시절 다들 한 번씩은 이름으로 궁합을 본 적이 있을 것이다. 이것과 비슷한 방식으로 중앙대학교에는 핸드폰 번호 궁합을 보는 것이 유행이라고 한다. 핸드폰 번호 궁합을 보기 위해서는 www.acmicpc.net 문제 어린시절 다들 한 번씩은 이름으로 궁합을 본 적이 있을 것이다. 이것과 비슷한 방식으로 중앙대학교에는 핸드폰 번호 궁합을 보는 것이 유행이라고 한다. 핸드폰 번호 궁합을 보기 위해서는 먼저 궁합을 보고싶은 두 중앙대생 A와 B의 핸드폰 번호에서 맨 앞의 010과 "-"(하이픈)을 모두 제외한 후, A부터 시작하여 한 숫자씩 번갈아가면서 적는다. 그리고 인접한 두 숫자끼리 더한 값의 일의 자리..
2023.11.08
no image
[BOJ] [Python] 3187번 : 양치기 꿍
https://www.acmicpc.net/problem/3187 3187번: 양치기 꿍 입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다. www.acmicpc.net 문제 더보기 양치기 꿍은 맨날 늑대가 나타났다고 마을 사람들을 속였지만 이젠 더이상 마을 사람들이 속지 않는다. 화가 난 꿍은 복수심에 불타 아예 늑대들을 양들이 있는 울타리안에 마구 집어넣어 양들을 잡아먹게 했다. 하지만 양들은 보통 양들이 아니다. 같은 울타리 영역 안의 양들의 숫자가 늑대의 숫자보다 더 많을 경우 늑대가 전부 잡아먹힌다. 물론 그 외의 경우는 양이 전부 잡아먹히겠..
2023.08.27
728x90

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

 

1038번: 감소하는 수

음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를

www.acmicpc.net

문제


음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다.

 

입력


더보기

첫째 줄에 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수 또는 0이다.

 

 

출력


더보기

첫째 줄에 N번째 감소하는 수를 출력한다

 

풀이방법


조합(Combination)을 이용해 문제를 해결하였다.

1 자릿수 >> 10 Combination 1 => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 

2 자릿수 >> 10 Combination 2 => (0,1), (0,2), (0,3) ... (8,9)

* 여기서 tuple을 뒤집어서 합친다면 (10, 20, 30, ... 98 ) 이러한 방식으로 나온다. 

이러한 방식으로 10 Combination 1 to 10 까지 배열에 추가한 뒤, 배열을 정렬하면 감소하는 수의 배열이 된다.

배열의 길이 < N + 1 인 경우 : -1 출력, 그 외의 경우 배열[N]을 출력한다.

 

코드


from itertools import combinations

ans = []
comb = list(range(10))

for i in range(1,11):
    for j in combinations(comb,i):
        ans.append(int(''.join(list(map(str,reversed((j)))))))

ans.sort()

n = int(input())

if len(ans) < n+1:
    print(-1)
else:
    print(ans[n])

 

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] [Python] 17262번: Four Squares  (1) 2023.11.21
[BOJ] [C++] 17264번 I AM IRONMAN  (2) 2023.11.21
[BOJ] [C++] 2309번: 일곱 난쟁이  (0) 2023.11.20
[BOJ] [Python] 10419번: 지각  (2) 2023.11.20
[BOJ] [Python] 9440번: 숫자더하기  (0) 2023.11.17
728x90

 

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

문제


왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다. 

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

 

입력


더보기

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

 

출력


더보기

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

 

풀이방법


9명의 난쟁이 중에서 2명의 난쟁이 키를 제외하는 방법을 BruteForce 방법을 이용해 계산하여 오름차순으로 출력한다.

 

코드


#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;

typedef long long int ll;

int main()
{
  fastio;
  int K[9],sum_temp=0,i,j;
  for(int i=0;i<9;i++)
  {
    cin>>K[i];
    sum_temp+=K[i];
  }
  sort(K,K+9);
  const int sum=sum_temp;
  for(i=0;i<8;i++)
  {
    int B=0;
    for(j=i+1;j<9;j++)
    {
      if(sum-(K[i]+K[j])==100)
      {
        B=1; 
        break;
      }
    }
    if(B) break;
  }
  for(int l=0;l<9;l++)
  {
    if(i==l or j==l) continue;
    else cout<<K[l]<<"\n";
  }
}

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] [C++] 17264번 I AM IRONMAN  (2) 2023.11.21
[BOJ] [Python] 1038번: 감소하는 수  (0) 2023.11.21
[BOJ] [Python] 10419번: 지각  (2) 2023.11.20
[BOJ] [Python] 9440번: 숫자더하기  (0) 2023.11.17
[BOJ] [Python] 6593번 : 상범 빌딩  (0) 2023.11.16
728x90

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

 

문제


창영이는 이번학기에 어떤 교양수업을 듣고 있다. 그런데, 그 교수님은 매우 지각을 자주 하시고 게다가 수업에 지각을 하였을 경우 수업을 일찍 마쳐 주기까지 하는 것을 발견하였다.

창영이는 교수님의 지각시간 0이상의 정수 t와 수업을 일찍 마쳐주는 시간 s 사이에 다음과 같은 관계가 있음을 알았다.

$s = t^2$

문득 창영이는 수업시간 d가 주어졌을 때, 교수님이 얼마나 지각을 할 수 있는지 궁금해졌고, 여러분은 창영이를 도와서 교수님이 지각할 수 있는 최대의 시간을 알아보자. 물론, 교수님이 도착하자마자 수업을 일찍 마쳐서 수업이 끝나는 것도 가능하다. 예를 들어, 수업시간이 6분인 경우, 교수님이 2분 지각을 하면, 4분간 수업을 일찍 마치게 되고, 2+4=6이기 때문에 바로 수업을 끝낼 수 있다. 또 다른 예로, 수업시간이 7분인 경우 교수님이 2분 지각을 하면, 수업을 4분 일찍 마쳐줄 수 있고, 2+4≤7 이므로 가능한 경우가 되고, 교수님이 3분 지각을 하게 되면, 수업을 9분 일찍 마쳐야 되고, 3+9>7 이므로, 교수님이 3분 지각을 하는 것은 불가능하다. 따라서, 교수님은 수업시간이 7분인 경우 교수님은 최대 2분간 지각을 할 수 있다.

 

입력


더보기

창영이가 궁금한 경우의 수 T(1 ≤ T ≤ 100)가 첫 번째 줄에 주어지고, 이어서 T 개의 줄에 수업시간 d(1 ≤ d ≤ 10,000, d는 정수)가 차례대로 주어진다.

출력


더보기

수업시간에 따른 교수님이 지각할 수 있는 최대 시간 t를 정수로 구해서 출력한다.

 

풀이방법


$t$의 제곱근을 구하고 현재 시간에 지각이 가능한지 구한다.($ t + t^2 <= s$)

만약 불가능하다면 $t$를 1 빼고 계산한다.

while문 탈출할 때의 $t$ 값이 정답이다.

 

코드


import sys
input = sys.stdin.readline

def main():
    n = int(input())
    for _ in range(n):
        s = int(input())
        t = int(s**0.5)
        while (t + t**2) > s:
            t -= 1
        print(t)
if __name__ =='__main__':
    main()
728x90

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

 

9440번: 숫자 더하기

강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다. 숫자 1, 2, 7, 8, 9 를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요? 강민이는 이 문제의 답이 2

www.acmicpc.net

문제

강민이가 초등학교 3학년일 때, 담임선생님이 이런 문제를 냈었다.

숫자 1, 2, 7, 8, 9를 사용해서 만든 두 숫자를 더했을 때, 나올 수 있는 가장 작은 수는 무엇일까요?

강민이는 이 문제의 답이 207(78 + 129)이라고 생각했다. 그런데 선생님은 책 4페이지에 있는 비슷한 문제를 모두 풀어오라는 숙제를 내셨다. 

작년부터 프로그래밍을 시작한 강민이는 이런 숙제보다 코딩을 더 재밌어했다. 그래서 강민이는 이 숙제를 코딩으로 해결하기로 했다!

어린 강민이를 위해 코딩을 도와주자.

더보기

입력

한 줄에 하나씩 연습문제가 주어진다.

각 줄에서 첫 번째로 나오는 정수 N (2 ≤ N ≤ 14) 은 연습문제에서 사용될 숫자의 개수이다.

두 번째부터 사용될 N개의 숫자가 주어진다. 0이 아닌 수가 최소 2개 이상 존재한다

마지막 줄에 0을 입력하면 프로그램이 종료된다.

 

출력

각 연습문제마다 정답을 출력한다.

 

풀이방법

풀이방법은 간단합니다.

 

1. 숫자들을 정렬합니다.

-> 정렬해야 작은 수가 큰 자릿수를 차지하기 때문에 덧셈을 했을 때, 작은 수가 나옵니다.

2. 모든 0을 index가 0의 개수 + 2에 해당하는 index에 모두 넣습니다.

3. 숫자의 길이가 짝수인지 홀수인지 구합니다.

3-1. 짝수인 경우 a,b 배열에 맨 앞의 숫자 하나씩 넣습니다.

3-2. 홀수인 경우, a 배열에 0번째 index,를 넣은 뒤, a, b 배열에 번갈아 숫자를 넣습니다.

 

짝수인 경우

1 3 0 0 2 6

(정렬)

0 0 1 2 3 6

(0을 뒤로 넘김)

1 2 0 0 3 6

a배열 1 0 3, b 배열 2 0 6

-> 309

 

홀수인 경우

1 3 0 0 0 2 6

(정렬)

0 0 0 1 2 3 6

(0을 뒤로 넘김)

1 2 0 0 0 3 6

a배열 1 0 0 6 b  배열 2 0 3

->1209

 

 

코드

import sys
from collections import deque

while True:
    arr = deque(map(int, sys.stdin.readline().rstrip().split()))
    if arr[0] == 0:
        break
    arr.popleft()
    # 정렬
    arr = sorted(arr)
    zeros = 0
    for i in arr:
        if i == 0:
            zeros += 1
        else:
            break
    for i in range(zeros):
        arr.pop(0)
    for i in range(zeros):
        arr.insert(2,0)

    a, b = [], []
    if len(arr)% 2 == 0:
        for i in range(len(arr)):
            if i % 2 == 0:
                a.append(arr[i])
            else:
                b.append(arr[i])
        print(int("".join(map(str,a)))+ int("".join(map(str,b))))
    else:
        a.append(arr[0])
        for i in range(1,len(arr)):
            if i % 2 == 1:
                a.append(arr[i])
            else:
                b.append(arr[i])
        print(int("".join(map(str,a)))+ int("".join(map(str,b))))

결론

0을 뒤로 넘기는 것, 짝수와 홀수일때 수를 넘기는 것과 str, int 형변환만 잘한다면 바로 풀리는 문제입니다.

728x90

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

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

문제

더보기

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서만 탈출할 수 있다.

당신은 상범 빌딩을 탈출할 수 있을까? 만약 그렇다면 얼마나 걸릴까?

 

입력

더보기

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서만 탈출할 수 있다.

당신은 상범 빌딩을 탈출할 수 있을까? 만약 그렇다면 얼마나 걸릴까?

 

출력

더보기

각 빌딩에 대해 한 줄씩 답을 출력한다. 만약 당신이 탈출할 수 있다면 다음과 같이 출력한다.

Escaped in x minute(s).

여기서 x는 상범 빌딩을 탈출하는 데에 필요한 최단 시간이다.

만일 탈출이 불가능하다면, 다음과 같이 출력한다.

Trapped!

 

풀이방법

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

이 문제와 비슷하게 풀면 됩니다.

dx, dy 뿐만 아니라 dz 까지 추가해서 동, 서, 남, 북, 상, 하까지 6가지 방법으로 BFS를 사용해서 출구를 찾으면 됩니다. 대신에 출구를 찾지 못하면 Trapped!를 출력하면됩니다.

 

 

코드

import sys
from collections import deque

input = sys.stdin.readline

dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]

def bfs():
    while s:
        item = s.popleft()
        z, x, y, cnt = item
        if E[0] == x and E[1] == y and E[2] == z:
            return cnt
        for i in range(6):
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]

            if 0 <= nx < n and 0 <= ny < m and 0 <= nz < h:
                if not visited[nz][nx][ny] and (matrix[nz][nx][ny] == '.' or matrix[nz][nx][ny] == 'E'):
                    visited[nz][nx][ny] = True
                    s.append([nz, nx, ny, cnt + 1])

    return -1


while True:
    h, n, m = map(int ,input().rstrip().split())
    matrix = []
    if h == n == m == 0:
        break

    # 행렬 입력
    for __ in range(h):
        if __ > 0:
            input()
        temp = [list(list(input().rstrip())) for _ in range(n)]
        matrix.append(temp)

    visited = [[[False] * m for _ in range(n)] for __ in range(h)]

    s = deque([])

    roof = False
    for k in range(h):
        for i in range(n):
            for j in range(m):
                if matrix[k][i][j] == 'S':
                    s.append([k,i,j,0])
                    visited[k][i][j] = True
                if matrix[k][i][j] == 'E':
                    E = [i,j,k]

    # s 위치 찾기
    result = bfs()

    if result == -1:
        print("Trapped!")
    else:
        print(f"Escaped in {result} minute(s).")
    input()

 

728x90

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

 

11945번: 뜨거운 붕어빵

입력으로 주어지는 각 행을 반전시켜서 출력하면 됩니다. 입력의 1행 1열은 출력의 1행 M열로, 입력의 1행 2열은 출력의 1행 M-1열로 … 입력의 1행 M열은 출력의 1행 1열로 … 입력의 N행 M열은 출력

www.acmicpc.net

문제

고려대학교에 입학한 새내기 호돌이는 안암역을 지나다가 한 붕어빵 장수를 만났어요.

“안녕, 안녕, 안녕하십니까, 아저씨! 붕어빵 두 개 주세요.”

“안녕을 세 번 외쳤으니 붕어빵 세 개!”

붕어빵 두 개의 값을 내고 세 개를 받은 호돌이는 기분이 좋았어요. 호돌이가 붕어빵 하나를 꺼내어 한 입 물었는데…. 너무 뜨거워서 그만 붕어빵을 떨어뜨리고 말았어요ㅠㅠ

붕어빵은 자유 낙하운동을 하면서 땅에 떨어졌는데 신기하게도 좌우가 뒤집힌 모양으로 착지했답니다. 호돌이가 붕어빵을 한 입 물기 전의 모양이 입력으로 주어지면, 땅에 떨어졌을 때에는 어떤 모양일지 출력하세요.

 

입력

더보기

첫째 줄에는 두 개의 정수 N과 M(0≤N,M≤10)이 주어집니다. 둘째 줄부터 N개의 줄에 걸쳐 붕어빵의 모양이 주어집니다. 각 행에는 공백을 나타내는 ‘0‘ 또는 붕어빵을 나타내는 ‘1’이 총 M개 주어집니다. 

 

출력

더보기

입력으로 주어진 붕어빵이 좌우로 뒤집힌 모양을 출력하세요.

 

풀이방법

각 줄을 반대로 출력하면 간단하게 풀리는 문제다.

 

코드

N,M=map(int,input().split())

for i in range(N):
    Bread=input() 	# 각 줄을 입력받음
    print(Bread[::-1])	# 각 줄을 반대로 출력한다.
728x90

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

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

문제


2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×17 직사각형을 채운 한가지 예이다.

입력


더보기

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

 

출력


더보기

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

 

풀이방법


위와 같은 방식으로  일반식을 도출해낼 수 있다.

초기 값은 이러하다. $f(1) = 1 $, $f(2) = 3$ 

$f(3)$ 부터는 빨간색과 회색을 통해서 일반식을 구할 수 있다. 

$f(n) = f(n-1) + 2f(n-2)$ 와 같은 일반식으로 도출할 수 있다.

마지막으로 구한 값에 10007로 나누어 값을 할당한다.

 

코드


import sys

input = sys.stdin.readline

dp = [0 for _ in range(1001)]

dp[1] = 1
dp[2] = 3

N = int(input())

for i in range(3, N+1):
    dp[i] = (dp[i-1] +2 * dp[i-2]) % 10007

print(dp[N])

 

728x90

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

 

14916번: 거스름돈

첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.

www.acmicpc.net

문제


춘향이는 편의점 카운터에서 일한다.

손님이 2원짜리와 5원짜리로만 거스름돈을 달라고 한다. 2원짜리 동전과 5원짜리 동전은 무한정 많이 가지고 있다. 동전의 개수가 최소가 되도록 거슬러 주어야 한다. 거스름돈이 n인 경우, 최소 동전의 개수가 몇 개인지 알려주는 프로그램을 작성하시오.

예를 들어, 거스름돈이 15원이면 5원짜리 3개를, 거스름돈이 14원이면 5원짜리 2개와 2원짜리 2개로 총 4개를, 거스름돈이 13원이면 5원짜리 1개와 2원짜리 4개로 총 5개를 주어야 동전의 개수가 최소가 된다.

 

입력


더보기

첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.

 

출력


더보기

거스름돈 동전의 최소 개수를 출력한다. 만약 거슬러 줄 수 없으면 -1을 출력한다.

 

풀이방법


1. 5원 코인 수, 2원 코인 수와 제외한 나머지 값을 구한다. (a, b, m)

2. 나머지 값(m)이 0이면 a와 b의 값을 더해서 출력한다.

3. 나머지 값이 0이 아니라면

  ㄱ. 5원 코인 수에서 1을 뺍니다.

  ㄴ. 나머지 값 5를 더합니다.

  ㄷ. 나머지 값을 통해 2원 코인의 수를 더합니다.

  ㄹ. 나머지 값에 2로 나눈 나머지 값으로 바꿉니다.

  ㅁ. 2번으로 돌아갑니다.

 

코드


# 빠른 입출력
import sys
input = sys.stdin.readline

n = int(input())
if n == 1 or n == 3:
    print(-1)
    exit(0)


a = n // 5
b = (n - a * 5) // 2
m = n - (a * 5 + b * 2)

while m != 0:
    a -= 1
    m += 5
    b += m // 2
    m = m % 2

print(a+b)
728x90

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

 

17202번: 핸드폰 번호 궁합

어린시절 다들 한 번씩은 이름으로 궁합을 본 적이 있을 것이다. 이것과 비슷한 방식으로 중앙대학교에는 핸드폰 번호 궁합을 보는 것이 유행이라고 한다. 핸드폰 번호 궁합을 보기 위해서는

www.acmicpc.net

 

문제


어린시절 다들 한 번씩은 이름으로 궁합을 본 적이 있을 것이다. 이것과 비슷한 방식으로 중앙대학교에는 핸드폰 번호 궁합을 보는 것이 유행이라고 한다.

핸드폰 번호 궁합을 보기 위해서는 먼저 궁합을 보고싶은 두 중앙대생 A와 B의 핸드폰 번호에서 맨 앞의 010과 "-"(하이픈)을 모두 제외한 후, A부터 시작하여 한 숫자씩 번갈아가면서 적는다. 그리고 인접한 두 숫자끼리 더한 값의 일의 자리를 두 숫자의 아래에 적어나가면서 마지막에 남는 숫자 2개로 궁합률을 구하게 된다.

 

예를 들어, 아래의 그림과 같이 A의 번호가 010-7475-9336 이고, B의 번호가 010-3619-5974 이면, 7346715995393764에서 시작하여 070386484822030, 77314022204233, 4045424424656, 449966866011, 83852442612, 1137686873, 240344450, 64378895, 0705674, 775131, 42644, 6808, 488, 26이 되어 둘은 26%의 궁합률을 가지게 된다.

 

위의 예시에서처럼 인접한 두 숫자를 더한 값이 두자리 정수가 되더라도, 일의 자리 숫자만 적는다. 가령 7과 3을 더하면 0을 적고, 4와 8을 더하면 2를 적는다.

중앙대학교에서 유행인 핸드폰 번호 궁합률을 알아보는 프로그램을 작성해보자. 단, A와 B의 핸드폰 번호는 다르다고 가정한다.

 

입력


더보기

첫 번째 줄에는 궁합을 보고싶은 중앙대생 A의 핸드폰 번호가 주어진다.

두 번째 줄에는 궁합을 보고싶은 상대방 B의 핸드폰 번호가 주어진다.

핸드폰 번호는 맨 앞의 010과 "-"(하이픈)을 제외하여 숫자 8개로 주어진다.

A와 B의 핸드폰 번호는 같지 않다.

 

출력


더보기

A와 B의 핸드폰 번호 궁합률을 두자리 정수로 출력한다.

십의 자리가 0이어도 앞에 0을 붙여 두자리로 출력한다.

 

풀이방법


DP 방식으로 접근해서 해결했습니다.

1. 번호를 list에 번갈아가면서 저장합니다.

2. 2개의 번호를 계산한 값을 10으로 나눈 몫을 list에 저장합니다. 리스트의 마지막까지 계산하면 마지막 원소를 제거합니다.

3. list의 길이가 2가 되면 while문을 정지하고 값을 출력합니다.

 

코드


import sys
input = sys.stdin.readline

a = input().rstrip()
b = input().rstrip()
ans = []

for i in range(len(a)):
    ans.append(int(a[i]))
    ans.append(int(b[i]))

while len(ans) > 2:
    for i in range(len(ans)-1):
        ans[i] = (ans[i] + ans[i+1]) % 10
    ans.pop()
print(''.join(map(str,ans)))

결론


브론즈 1 문제여서 그런지 정말 간단한 문제였다.

728x90

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

 

3187번: 양치기 꿍

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다. 다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

www.acmicpc.net

문제

더보기

양치기 꿍은 맨날 늑대가 나타났다고 마을 사람들을 속였지만 이젠 더이상 마을 사람들이 속지 않는다. 화가 난 꿍은 복수심에 불타 아예 늑대들을 양들이 있는 울타리안에 마구 집어넣어 양들을 잡아먹게 했다.

하지만 양들은 보통 양들이 아니다. 같은 울타리 영역 안의 양들의 숫자가 늑대의 숫자보다 더 많을 경우 늑대가 전부 잡아먹힌다. 물론 그 외의 경우는 양이 전부 잡아먹히겠지만 말이다.

꿍은 워낙 똑똑했기 때문에 이들의 결과는 이미 알고있다. 만약 빈 공간을 '.'(점)으로 나타내고 울타리를 '#', 늑대를 'v', 양을 'k'라고 나타낸다면 여러분은 몇 마리의 양과 늑대가 살아남을지 계산할 수 있겠는가?

단, 울타리로 막히지 않은 영역에는 양과 늑대가 없으며 양과 늑대는 대각선으로 이동할 수 없다.

입력

더보기

입력의 첫 번째 줄에는 각각 영역의 세로와 가로의 길이를 나타내는 두 개의 정수 R, C (3 ≤ R, C ≤ 250)가 주어진다.

다음 각 R줄에는 C개의 문자가 주어지며 이들은 위에서 설명한 기호들이다.

 

출력

더보기

살아남게 되는 양과 늑대의 수를 각각 순서대로 출력한다.

 

풀이방법

방법은 BFS로 풀었습니다.

 

 . , v, k 로 이루어진 블럭을 BFS로 찾습니다. 블럭안에 v와 k의 크기의 따라  k  > v 면 k, 0 을 반환하고 k <= v 면 0, v 를 반환하여 총합을 반환합니다.

 

 

코드

from collections import deque
import sys

input = sys.stdin.readline

r, c = map(int , input().rstrip().split())

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(i, j):
    w, s = 0, 0
    visited[i][j] = True
    deq = deque([(i,j)])
    while deq:
        x, y = deq.popleft()
        if matrix[x][y] == 'k':
            s += 1
        if matrix[x][y] == 'v':
            w += 1
        for k in range(4):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < r and 0<= ny < c and visited[nx][ny] == False and matrix[nx][ny] != '#':
                deq.append((nx,ny))
                visited[nx][ny] = True
    if s > w:
        w = 0
    else:
        s = 0
    return w, s



matrix = [list(list(input().rstrip())) for _ in range(r)]
visited = [[False] * c for _ in range(r)]

total_w, total_s = 0, 0
for i in range(r):
    for j in range(c):
        if matrix[i][j] != '#' and visited[i][j] == False:
            w,s = bfs(i,j)
            total_w += w
            total_s += s
print(total_s, total_w)