문제 번호 : 16922

문제 출처 : https://www.acmicpc.net/problem/16922

 

16922번: 로마 숫자 만들기

2, 6, 10, 11, 15, 20, 51, 55, 60, 100을 만들 수 있다.

www.acmicpc.net


더보기
문제

로마 숫자에서는 수를 나타내기 위해서 I, V, X, L을 사용한다. 각 문자는 1, 5, 10, 50을 의미하고, 이 문제에서 다른 문자는 사용하지 않는다.

하나 또는 그 이상의 문자를 이용해서 수를 나타낼 수 있다. 문자열이 나타내는 값은, 각 문자가 의미하는 수를 모두 합한 값이다. 예를 들어, XXXV는 35, IXI는 12를 의미한다.

실제 로마 숫자에서는 문자의 순서가 중요하지만, 이 문제에서는 순서는 신경쓰지 않는다. 예를 들어, 실제 로마 숫자에서 IX는 9를 의미하지만, 이 문제에서는 11을 의미한다.

로마 숫자를 N개 사용해서 만들 수 있는 서로 다른 수의 개수를 구해보자.

입력

첫째 줄에 사용할 수 있는 문자의 개수 N (1 ≤ N ≤ 20)이 주어진다.

출력

첫째 줄에 로마 숫자 N개를 사용해서 만들 수 있는 서로 다른 수의 개수를 출력한다.

예제 입력 1

1

예제 출력 1

4

I, V, X, L을 만들 수 있다.

예제 입력 2

2

예제 출력 2

10

2, 6, 10, 11, 15, 20, 51, 55, 60, 100을 만들 수 있다.

예제 입력 3

10

예제 출력 3

244


Code

import itertools

n = int(input())
rome = [1, 5, 10, 50]


comb = list(itertools.combinations_with_replacement(rome, n))
data = set([])
for t in comb:
    data.add(sum(t))

print(len(data))

조합(Combination) 문제라 생각하고 itertools를 사용해서 문제를 풀어봤다. rome이라는 데이터셋에서 n개의 데이터를 반복이 되도록 조합한다. comb 리스트 안에 각 원소들은 tuple 자료형이다. 그냥 조합만을 사용해서 했을 경우에는 합이 중복되는 경우가 존재했고 data라는 집합 자료형에 각 튜플들의 합을 넣어주면서 중복을 피했다.

중복이 일어나는 예시로는 n이 6인 경우 XXXXXV 와 LIIIII 이 둘 다 55의 값을 가지게 된다.

 

※주의할 점

  • combinations_with_replacement()의 반환 형태가 class로 존재하며 이것을 iterable한 자료형으로 바꿔주어야 한다. 
  • 집합 자료형은 중복을 허용하지 않고 인덱스를 가지지 않는다.

 

다음 코드는 itertools를 import하지 않고 반복문을 사용한 코드이다.

n = int(input())
rome = [1, 5, 10, 50]
result = set([0])
for _ in range(n):
    result = set([i + j for i in result for j in rome])

print(len(result))

처음에 n 만큼 반복하면서 result에 원소들을 넣는 것이 아니라 완전히 새로운 집합으로 만든다.

위의 for 문와 비슷하게 다음 코드를 조금 더 보기 쉽게 만든 것이다.

tmp = []
for _ in range(n):
    for i in result:
        for j in rome:
            tmp.append(i + j)
    result = set(tmp)
    tmp = []

 

 

[백준][파이썬]** 16917번 - 양념 반 후라이드 반


문제 번호 : 16917
문제 출처 : https://www.acmicpc.net/problem/16917

 

16917번: 양념 반 후라이드 반

현진 치킨에서 판매하는 치킨은 양념 치킨, 후라이드 치킨, 반반 치킨으로 총 세 종류이다. 반반 치킨은 절반은 양념 치킨, 절반은 후라이드 치킨으로 이루어져있다. 양념 치킨 한 마리의 가격은

www.acmicpc.net

 



Code

a, b, c, x, y = map(int, input().split())

result = a * x + b * y

if a + b > 2 * c:
    more = a if x >= y else b   # more : 더 많이 시켜야하는 치킨 종류의 가격
    if c * 2 < more:
        result = c * 2 * max(x, y)
    else:
        result = c * 2 * min(x, y) + more * (max(x,y) - min(x,y))
print(result)

Idea

  1. 초기 결과 값은 후라이드와 양념을 모두 따로 시키는 방법으로 설정
  2. 반반 두 마리를 시켜서 후라이드 한 마리, 양념 한 마리를 만드는 방식이 더 싼 경우를 고려
  3. 더 많이 시켜야 하는 치킨 종류의 가격이 반반의 가격보다 비싸면 모두 반반으로 구매
  4. 그렇지 않은 경우 더 적은 갯수 까지는 반반으로 시키고 이후에는 한 마리 씩 구매

[백준][파이썬]** 16968번 - 차량 번호판 1


문제 번호 : 16968
문제 출처 : https://www.acmicpc.net/problem/16968

 

16968번: 차량 번호판 1

00부터 99까지 총 100가지 중에서 00, 11, 22, 33, 44, 55, 66, 77, 88, 99가 불가능하다.

www.acmicpc.net



Code

s = input()

if s[0] == 'd':
    result = 10
    state = 1
else:
    result = 26
    state = 0

for ch in s[1:]:
    if ch == 'd':
        result *= (10 - state)
        state = 1
    else:
        result *= (26 + state -1)
        state = 0

print(result)

Idea

  1. 입력을 받을 때 문자를 그대로 사용하기 위해서 따로 list형으로 변환하지 않음
  2. 입력의 첫 번째 문자가 d인지 c인지에 따라서 state라는 flag를 설정
  3. 두 번째 문자부터 확인하면서 상황에 맞게 가능한 갯수를 계산하여 곱 연산
  4. 상황에 맞게 state도 변경시켜준다.
6001. Hello 출력하기 

 

print('Hello')
print("Hello")

# 출력
# Hello

두 문장 모두 Hello가 출력 된다.

파이썬의 인터프리터에서는 ' 와 " 차이를 두지 않는다.

문자를 표현할 때 ' 를 사용하고 문자열을 표현할 때에는 " 를 사용하는 것이 보편적이다.

 


6002. Hello World 출력하기
# 1
print("Hello World")
# 2
print("Hello", "World")
# 3
print("Hello", end = ' ')
print("World")

# 출력
# Hello World

print()에서 반점( , ) 으로 구분하는 경우에는 자동으로 사이에 공백이 추가된다. 공백 외에 다른 문자를 넣고 싶은 경우 sep = '*' 과 같은 형태로 써주면 된다.

print()를 하게 되면 파이썬에서는 default로 개행을 하게 된다. 줄바꿈을 하기 싫다면 위와 같이 end = ' '로 작은 따옴표 사이에 넣고 싶은 문자를 넣으면 된다.


6003. Hello World 개행해서 출력하기
# 1
print("Hello")
print("World")
# 2
print("Hello\nWorld")
# 3
print("Hello", "World", sep = '\n')
# 4
print("""Hello
World
""")

# 출력
# Hello
# World

print()는 자동으로 줄바꿈을 한다.

4번에서 사용한 방법은 "docstring"이라 한다. 가장 직관적이고 가독성이 좋지만 소스코드가 길어지는 단점이 있다.

""" 와 """사이에 원하는 형태로 문자열을 넣으면 입력한 형태 그대로 출력이 된다.


6004. 작은 따옴표 출력하기
# 1 
print("'Hello'")
# 2
print("\'Hello\'")
# 3
print('\'Hello\'')

# 출력
# 'Hello'

작은 따옴표( ' )를 출력하는 방법으로는 2가지가 있다.

하나는 큰 따옴표 안에 '를 포함시키는 것이고 다른 하나는 \를 사용해서 \' 로 표현하는 것이다.


6005. 큰 따옴표 출력하기
# 1
print('"Hello World"')
# 2
print("\"Hello World\"")
# 3
print('\"Hello World\"')

# 출력
# "Hello World"

큰 따옴표는 작은 따옴표와 반대로 작은 따옴표 안에 포함이 되면 출력이 가능하다. 혹은 작은 따옴표처럼 \문자를 사용하여 \"로 문자를 표현해주면 가능하다.

\는 역슬래쉬와 같으며 \를 사용하는 이스케이프 문자들은 나중에 따로 정리하겠다.


6006. 특수문자 출력하기
print("\"!@#$%^&*()\'")

# 출력
# "!@#$%^&*()'

작은 따옴표같은 경우에는 \를 붙이지 않았어도 됐지만 통일성을 위해 \를 표시했다.

한 문자열에 "와 '가 같이 있는 경우가 있기 때문에 모든 따옴표는 \와 함께 표현하는 것이 좋다.


6007. 파일 경로 출력하기
print("\"C:\\Download\\\'hello\'.py\"")

# 출력
# "C:\Download\'hello'.py"

역슬래쉬(\) 같은 경우에도 \\로 표현해야 문자 '\' 로 표현이 되기 때문에 \\를 사용해주는 것이 좋다.

\\로 표현하지 않아도 \가 출력되긴 한다.


6008. print("Hello\nWorld") 출력하기
print("\"Hello\\nWorld\"")

 

'프로그래밍 > CodeUp' 카테고리의 다른 글

[CodeUp] Python 기초 100제 - 6010~6020  (0) 2022.06.20
[CodeUp] Python 기초100제 - 6009  (0) 2021.09.13

+ Recent posts