문제:

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.
문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H층 건물이라고 가정하자. (1<=H,W<=99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자.이런 형태의 호텔을 H x W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

입력:

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1<=H,W<=99,1<=N<=H x W).

출력:

프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.

풀이방법:

거리가 낮은 순으로 배정이 되어야 하고 같다면 아래층부터 배정이 된다. 처음엔 xxx1호의 아래층부터 제일 최상층의 xxx1호까지 먼저 배정을 하고 그 다음은 xxx2호를 동일하게 배정을 한다. 그러면 단순하게 몫을 구하는 연산자와 나머지를 구하는 연산자로 쉽게 구할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
def hotel(h,w,n):
    a=(n-1)//h
    b=((n-1)%h)+1
    if a < 9:
        return str(b)+str(0)+str(1+a)
    else:
        return str(b)+str(1+a)
def repeat(n):
    for i in range(n):
        h,w,n=map(int,input().split())
        print(hotel(h,w,n))
n=int(input())
repeat(n)
cs



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

[BOJ]1475. 방번호  (0) 2019.04.10
[BOJ]2775. 부녀회장이 될테야  (0) 2019.04.09
[BOJ]2292. 벌집  (0) 2019.04.07
[BOJ]2941. 크로아티아 알파벳  (0) 2019.04.06
[BOJ]1157. 단어 공부  (0) 2019.04.05

문제:


위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 5개, 58까지는 5개를 지난다.

입력:

첫째 줄에 N(1<=N<=1,000,000,000)이 주어진다.

출력:

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

풀이 방법:

가운데 1에서부터 시작했을 때 1을 둘러싸고 있는 벌집의 방 갯수는 6이고, 이를 1층이라고 부르자.
그렇다면 이 1층을 둘러싸고 있는 벌집의 방 개수를 세어보면 12이고 이를 2층이라 할 수 있다.
계속 세어나가다 보면 3층의 갯수는 18개, 4층의 갯수는 24개...이렇게 증가함을 알 수 있다.
즉, 이 문제는 N이 몇 층에 속해있는지 파악하면 그 층이 최소 개수의 방의 수이다. while문을 사용해서 m이 n을 넘어갈 때까지 반복시키고 그 때마다 count를 세어서 count를 최종 반환하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
def bee(n):
    m = 1
    k = 1
    count = 1
    while n > m:
        count+=1
        m = m+6*k
        k+= 1
    return count
n=int(input())
print(bee(n))
cs


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

[BOJ]2775. 부녀회장이 될테야  (0) 2019.04.09
[BOJ]10250. ACM 호텔  (0) 2019.04.08
[BOJ]2941. 크로아티아 알파벳  (0) 2019.04.06
[BOJ]1157. 단어 공부  (0) 2019.04.05
[BOJ]1152. 단어의 개수  (0) 2019.04.04

문제:

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

 크로아티아 알파벳

변경 

 č

 c=

 ć

 c-

 dž

 dz=

 đ

 d-

 lj

 lj

 nj

 nj

 š

 s=

 ž

 z=


예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력:

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-' , '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력:

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

풀이 방법:

일단 크로아티아 알파벳을 리스트로 만들고 난 뒤 갯수를 세주고 난 뒤 이 값들을 ' '공백으로 바꾸어 준다. 바로 ''로 바꾸지 않은 이유는 nljj 와 같이 lj가 사라진 다음에 nj가 크로아티아 알파벳가 인식이 되기 때문이다. 그래서 공백으로 바꾸고 난 뒤에 마지막에 다시 ''로 바꿔서 특수한 알파벳이 아닌 알파벳들의 갯수를 센다.

1
2
3
4
5
6
7
8
9
10
11
12
def croatia(s):
    lis=['c=','c-','dz=','d-','lj','nj','s=','z=']
    answer = 0
    for i in lis:
        a = s.count(i)
        answer+=a
        s=s.replace(i,' ')
    s=s.replace(' ','')
    answer+=len(s)
    return answer
s=input()
print(croatia(s))
cs


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

[BOJ]10250. ACM 호텔  (0) 2019.04.08
[BOJ]2292. 벌집  (0) 2019.04.07
[BOJ]1157. 단어 공부  (0) 2019.04.05
[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1065. 한수  (0) 2019.04.03

문제:

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력:

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력:

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

풀이 방법:

우선 갯수를 세는 것을 편리하기 위해 전부 소문자로 변경한 후 set을 통해 unique한 값들을 구한다. 이를 반복문으로 탐색하며 갯수를 센 리스트를 만든다. 이후 여기서 max값이 두개 이상이면 ?를 출력하고 한개면 인덱스 값을 통해 값을 구하고 upper함수로 대문자로 만들어 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
def number(s):
    s=s.lower()
    un=[]
    string= list(set(s))
    for i in string:
        a=s.count(i)
        un.append(a)
    if un.count(max(un)) !=1:
        return '?'
    else:
        return string[un.index(max(un))].upper()
s=input()
print(number(s))
cs


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

[BOJ]2292. 벌집  (0) 2019.04.07
[BOJ]2941. 크로아티아 알파벳  (0) 2019.04.06
[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]1110. 더하기 사이클  (0) 2019.04.02

문제:

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.


입력:

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

출력:

첫째 줄에 단어의 개수를 출력한다.

풀이 방법:

다른 언어로 하면 어려운 것일지 잘 모르겠지만 적어도 파이썬으로는 쉽게 풀 수 있다. 파이썬은 input으로 띄어쓰기를 포함한 한 줄을 전체로 string으로 받으며 이를 split()을 사용하면 공백을 기준으로 나누어 리스토로 반환을 해준다. split()안에 변수 값을 넣어주면 그 값으로 분할을 해주지만 default값으로는 공백으로 설정되어 있다. 따라서 input().split()으로 받은 것의 길이를 세어주면 답이다.

1
2
3
n=input()
EmptyList=n.split()
print(len(EmptyList))
cs


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

[BOJ]2941. 크로아티아 알파벳  (0) 2019.04.06
[BOJ]1157. 단어 공부  (0) 2019.04.05
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01

문제:

어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한 수의 개수를 출력하는 프로그램을 작성하시오.

입력:

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

출력:

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

풀이방법:

100미만의 수는 항상 등차수열을 이루게 된다. 자릿수가 하나인 경우에는 그 수가 수열이 되는 경우이고 자릿수가 두자리인 경우에는 두 자릿수의 차이ㅣ만큼 등차수열을 이룬다고 생각할 수 있다. 따라서 이문제는 자릿수가 3자리인 경우에만 따져주면 된다. 3자리에서 한수가 되는 경우는 다음과 같다.

n-a , n, n+a 와 같이 a만큼의 등차를 가지는 수열이 3자리에서의 한수이다. 따라서 각 자릿수의 합이 가운데 수의 3배한 값과 같을 때 한수가 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def solution(n):
    if n <100:
        answer=n
        return answer
    else:
        answer=99
        for i in range(100,n+1):
            a=list(str(i))
            a=list(map(int,a))
            if sum(a)/3==a[1]:
                answer+=1
        return answer
n=int(input())
answer=solution(n)
print(answer)
cs


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

[BOJ]1157. 단어 공부  (0) 2019.04.05
[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31

문제:

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6=8이다. 새로운 수는 68이다. 6+8=14이다. 새로운 수는 84이다. 8+4=12이다. 새로운 수는 42이다. 4+2=6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N이 사이클의 길이를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고,99보다 작서나 같은 정수이다.

출력:

첫째 줄에 N의 사이클 길이를 출력한다.

풀이 방법:

첫번째 진행단계만 진행시켜준 뒤로 while문에 넣어서 다시 돌아올 때까지 계속 반복시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def cycle(n):
    answer=1
    n1 = n
    if n < 10:
        n = 10*n+n
    else:
        new_number1=n%10
        new_number2=n//10+n%10
        n=10*new_number1+new_number2%10
    while n1 != n:
        answer += 1
        if n < 10:
            n = 10*n+n
        else:
            new_number1=n%10
            new_number2=n//10+n%10
            n=10*new_number1+new_number2%10
    return answer
n=input()
n=int(n)
print(cycle(n))
cs


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

[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31
[BOJ]11718.그대로 출력하기  (0) 2019.03.30

문제:

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력:

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1<=N<=1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.


출력:

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

풀이 방법:

입력값들을 받는 함수 student와 그 입력 값을 받아서 비율을 계산해주는 blue라는 함수 두 개로 구성되어 있다. 입력이 학생의 수 이후에 점수들이 나타나는 형식으로 이루어져 있으므로 input().split()을 통해 리스트로 받아준 후 정수값과 리스트값으로 나누었다.
이를 blue에 넣어서 평균을 구하고 평균을 넘는 학생들의 수를 구하였다. 출력을 소수점 셋째 자리까지 출력해야 하는데 이는 round함수를 구하면 얻을 수 있다. round( value, number)로 구성되어 있는데 value를 소수점 number째 자리까지 반올림하여 출력해주는 함수이다. 따라서 round(value,3)과 같이 구하면 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def blue(n,a):
    sumscore=0
    person=0
    for i in range(n):
        sumscore += int(a[i])
        average=sumscore/n
    for i in range(n):
        if int(a[i]) > average:
            person +=1
        else:
            pass
    print("%.3f%%" % round(person/n*100,3))
def student(c):
    for i in range(c):
        m=input().split()
        n=int(m[0])
        a=m[1:]
        blue(n,a)
c=input()
c=int(c)
student(c)
cs


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

[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]2839.설탕 배달  (1) 2019.03.31
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 라면공장  (0) 2019.03.29

문제:

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

주의 사항:

정확하게 만들 수 없다면 -1을 출력한다.

풀이 방법:

while문을 사용해서 무게가 3인 봉지를 하나씩 늘리면서 필요한 무게가 5인 봉지의 수를 구하고, 다시 한 번 무게가 5인 봉지를 하나씩 늘리면서, 필요한 무게가 3인 봉지의 개수를 찾는다. 정확히 N킬로그램이 되는 경우만 배열에 넣는다. while문이 끝나고 배열의 길이가 1보다 크다면 그 중 가장 작은 값을 반환하고, 그렇지 않으면 -1을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def sugar(n):
    x=1
    count=[]
    while n//(3*x) > 0:
        if (n-3*x)%5 == 0:
            y= (n-3*x)//5
            count.append(x+y)
        x+=1
    y=1
    while n//(5*y) > 0:
        if (n-5*y)%3 == 0:
            x= (n-5*y)//3
            count.append(x+y)
        y+=1    
    if len(count)==0:
        return -1
    else:
        return min(count)
n=int(input())
print(sugar(n))
cs


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

[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28

문제:

입력받은 대로 출력하는 프로그램을 작성하시오.

 

입력:

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다.

각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

 

풀이 방법:

문제만 보면 받은 그대로 print를 하면 될 것 같지만 정답 비율이 25% 정도인 것을 보면 풀기 쉽지 않다는 것을 알 수 있다. 대다수의 사람들이 통과를 하지 못하는 점은 주어지는 예제가 언제 끝나는지 모른다는 점이다. 따라서 이 점을 예외처리를 사용해서 해결한다면 문제를 통과 할 수 있다.

 

while True:
    try:
        line=input()
        print(line)
    except:
        break

 

 

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

[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28
[Programmers]Lv 2. 점프와 순간이동  (0) 2019.03.27

+ Recent posts