반응형

1. 문제
    14655번 욱제는 도박쟁이야!!
    (https://www.acmicpc.net/problem/14655)

 

욱제는 라스베이거스에서 유명한 베팅꾼이다. 어찌나 게임을 잘 하는지 ‘제2의 홍진호’라는 별명이 붙었을 정도다. 어찌나 게임을 잘 하는지 ‘제2의 홍진호’라는 별명이 붙었을 정도다.

욱제가 주로 하는 게임은 아주 단순하고, 친숙한 게임이다. 바로 동전 뒤집기 게임이다. 이 게임에 쓰이는 동전의 양면에는 절댓값이 같고 부호가 다른 정수가 한 면에 하나씩 쓰여 있다. (단, 동전끼리는 쓰인 수의 절댓값이 다를 수 있다) 한 플레이어 당 두 번의 라운드가 주어진다. 모든 라운드는 같은 동전으로 진행되며, 딜러는 각 라운드마다 N개의 동전을 임의로 섞고 이를 일렬로 배열한다. 이때, 동전의 앞뒤 방향도 바뀔 수 있다. 첫 번째 라운드에서는 동전에 표시된 값들의 합이 최대가 되도록 뒤집어야 하고, 두 번째 라운드에서는 동전에 표시된 값들의 합이 최소가 되도록 뒤집어야 한다. (첫 번째 라운드 동전 값의 합) - (두 번째 라운드 동전 값의 합)이 해당 플레이어가 게임에서 획득한 점수이고, 이 점수가 최대가 되는 플레이어가 바로 게임의 승자가 된다.

욱제는 엄지, 검지, 중지를 이용해서 항상 연속한 3개의 동전을 뒤집는 최고의 동전 뒤집러이다. 욱제는 연속한 3개의 동전을 뒤집지 않으면 이길 수 없다고 생각하기 때문에 실패하는 경우 없이 항상 연속한 3개의 동전만 뒤집는다. 동전 배열의 양 끝에서 벗어나서 양 끝의 동전만 뒤집거나 양 끝의 두 개 동전만 뒤집는 것도 가능하다. 동전을 뒤집는 횟수에 제한은 없다.

(!) 너, 강해 보이는군. 나와 승부를 겨루자! 띠리링띠리링디리ㅣ리리ㅣ링~ 앗! 심술쟁이 해커 임준오(동탄 주민)이 승부를 걸어왔다!

욱제는 이번 게임에서 얼마의 점수를 획득하게 될까? 욱제는 최고의 베팅꾼이기 때문에 항상 게임에서 획득할 수 있는 최고의 점수를 얻는다는 사실은 자명하다.

 

 

2. 문제 포인트

  • 동전 개수 랜덤
  • 3개씩 (양 끝은 1개, 2개씩) 무제한으로 뒤집을 수 있음
  • 1라운드 최대 합계, 2라운드 최소 합계로 점수 계산
  • 최솟값은 절대값에 '-1'을 곱하면 최솟 합계가 됨
반응형

 

3. 접근법

  • 3개씩 (양 끝은 1개, 2개씩) 무제한으로 뒤집을 수 있음
    = 결과적으로 모든 숫자를 양수, 또는 음수로 만들 수 있음
  • 전체 숫자의 절대값을 계산하여 합계를 구하면 해결 가능

 

 

 

4. 결과 코드

import sys

a = sys.stdin.readline()

r1 = list(map(int, sys.stdin.readline().split()))
r2 = list(map(int, sys.stdin.readline().split()))

# 1라운드 최대값 구하기
## 모든 숫자가 양수가 되면 최대값 = 절대값들의 총합
r1 = sum(list(map(abs, r1)))

# 2라운드 최솟값 구하기
## 모든 숫자가 음수가 되면 최대값 = 절대값들의 총합 * -1
r2 = sum(list(map(abs, r2)))

print(r1 + r2)

# https://www.acmicpc.net/problem/14655
반응형
반응형

1. 문제

19564번 반복

(https://www.acmicpc.net/problem/19564)

 

muse는 네이버 카페에 글을 올리려고 한다. 하지만 키보드가 고장나서, 어떤 키를 누르든 abcdefghijklmnopqrstuvwxyz가 입력된다!

muse는 글을 올리고 싶지만, 원하는 글을 쓰기 위해서는 아래와 같은 작업을 해야 한다.

  1. abcdefghijklmnopqrstuvwxyz를 K번 반복해서 입력한다.
  2. 원하는 글자를 마우스로 지워, 최종 글을 완성한다.

muse는 많은 글자를 지우는 일이 귀찮기 때문에, K를 최소화하려 한다. muse가 원하는 글을 입력하려면 abcdefghijklmnopqrstuvwxyz를 몇 번 입력해야 하는지 구해 주자.

 

 

2. 문제 포인트

  • a-z까지 무조건 입력
    • n번째 글자가 n+1번째 글자보다 앞에(영어 알파벳 순) 있으면 한번입력으로 2개 이상의 글자를 완성 할 수 있음
  • a-z 입력 횟수 구하기

 

3. 접근법

  • 입력해야할 글자(input)를 ord()로 아스키 코드로 변환
  • n번째 글자와 n+1번째 글자의 아스키 코드를 비교하여 카운트 증가

 

반응형

 

4. 결과 코드

import sys

a = sys.stdin.readline().strip()

# 처음 한번은 무조건 a-z가 입력되어야 한다
cnt = 1

for i in range(len(a)-1):
    # ascii 코드를 이용해 n번 글자와 n+1번 글자 비교
    if  ord(a[i]) >= ord(a[i+1]):
        cnt += 1

print(cnt)

# https://www.acmicpc.net/problem/19564
반응형
반응형

1. 문제
    18238번 ZOAC 2 (링크 참고)

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

 

18238번: ZOAC 2

2019년 12월, 두 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다. 작년 ZOAC의 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로운 규칙을 고안해

www.acmicpc.net

 

2019년 12월, 두 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다.

작년 ZOAC의 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로운 규칙을 고안해냈다!

규칙은 이러하다.

  • 그림과 같은 원판에 문자들이 순서대로 적혀있다. 처음 순간에 화살표는 'A'를 가리키고 있다.
  • 원판은 왼쪽 또는 오른쪽으로 돌릴 수 있다. 원판을 한 칸 돌리는 데에는 1의 시간이 소요된다.
  • 화살표가 가리키고 있는 문자를 출력할 수 있다. 문자를 출력하는 데에 걸리는 시간은 없다.

시간이 너무 오래 걸리면 지루해할 ZOAC의 참가자들을 위해 성우는 해당 문자열을 앞에서부터 차례대로 최대한 빠르게 출력하려고 한다.

바쁜 성우를 위하여 해당 문자열을 출력하는 데 걸리는 시간의 최솟값을 구해보자.

 

출처 : 백준 https://www.acmicpc.net/problem/18238

 

 

2. 문제 포인트

  • 시작은 'A'에서 시작한다
  • 원판을 돌려 문자를 찾을때는 왼쪽 오른쪽 모두 가능하다
    = 가까운 쪽으로 돌려야 최솟값을 구할 수 있다.
  • 알파벳은 26글자이다
    현재 글자에서 다음 글자로 넘어갈때 중간값인 13초 넘게 걸리지 않는다
    (왼쪽, 오른쪽 모두 회전이 가능하기에 가까운 방향을 이용한다)

 

3. 접근법

  • 각 문자의 좌측으로 이동할때의 소요시간, 우측으로 이동할때의 소요시간을 계산
  • 두가지 계산값중 작은값 선택

 

반응형

 

 

4. 결과 코드

import sys

a = sys.stdin.readline().strip()
result = 0

# 소문자 입력에 대비해 대문자로 전환
a = a.upper()

# 시작점이 'A'를 추가
a = 'A' + a

for i in range(len(a)-1):
    # chr_1 = 좌측으로 이동할때의 소요시간
    # chr_2 = 우측으로 이동할때의 소요시간
    chr_1 = ord(a[i+1]) - ord(a[i])
    chr_2 = ord(a[i]) - ord(a[i+1])

    # chr_1, chr_2의 계산값이 음수가 나오는 경우 26을 더해 소요 시간 계산
    ## ex. 'AZ'의 경우 chr_2 = 65-90 = -25 음수가 발생
    ##     26을 더해줌으로 1이 되어 좌측으로 돌린 1이란 소요시간 계산 가능
    if chr_1 < 0:
        chr_1 += 26
    if chr_2 < 0:
        chr_2 += 26
    
    # 좌측 우측 이동 소요 시간중 작은값 선택
    result += min(chr_1, chr_2)
print(result)
반응형
반응형

 

1. 문제
    욱제는 효도쟁이야!! (링크 참고)

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

 

14487번: 욱제는 효도쟁이야!!

욱제는 KOI를 망친 기념으로 부모님과 함께 코드게이트 섬으로 여행을 떠났다. 코드게이트 섬에는 오징어로 유명한 준오마을(심술쟁이 해커 임준오 아님), 밥으로 유명한 재훈마을, 영중마을 등

www.acmicpc.net

 

욱제는 KOI를 망친 기념으로 부모님과 함께 코드게이트 섬으로 여행을 떠났다. 코드게이트 섬에는 오징어로 유명한 준오마을(심술쟁이 해커 임준오 아님), 밥으로 유명한 재훈마을, 영중마을 등 많은 관광지들이 있다. 욱제는 부모님을 모시고 코드게이트 섬을 관광하려고 한다.

코드게이트 섬은 해안가를 따라 원형으로 마을들이 위치해있다. 임의의 A마을에서 임의의 B마을로 가기 위해서는 왼쪽 또는 오른쪽 도로를 통해 해안가를 따라 섬을 돌아야 한다. 섬을 빙빙 도는 원형의 길 외에 다른 길은 존재하지 않는다.

각 마을에서 마을까지의 이동비용이 주어질 때, 욱제가 최소한의 이동비용으로 부모님을 모시고 섬의 모든 마을을 관광하려면 얼마의 이동비용을 준비해야하는지 알려주자.

 

출처 : 백준 https://www.acmicpc.net/problem/14487

 

 

2. 문제 포인트

  • 출발 마을은 선택 가능
  • 마을에서 이동은 좌우 근접 마을만 이동가능
  • 모든 마을 한번씩 방문

 

3. 접근법

  • 최대 비용인 마을에서 시작한다!

  • 위의 표를 보면 가장 비싼 구간인 D - C 구간을 피한 4번째 경로가 가장 작은 비용이 든다
  • 코드상에서 계산시 가장 큰 비용을 빼고 나머지 비용을 더하면 간단하게 계산된다

 

반응형

 

 

4. 결과 코드

import sys

// 마을 개수는 문제 계산과 무관하다
vil_num = sys.stdin.readline()

// 구간별 요금을 리스트로 입력받는다
fee = list(map(int, sys.stdin.readline().split()))

// 구간별 요금 총 합에서 가장 요금이 큰 구간의 요금을 빼면 최소 이동 비용이 나온다
result = sum(fee) - max(fee)

print(result)

 

반응형
반응형

 

1. 문제
    캥거루 위치 바꾸기 문제 (링크 참고)

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

 

11034번: 캥거루 세마리2

여러개의 테스트 케이스로 이루어져 있으며, 세 캥거루의 초기 위치 A, B, C가 주어진다. (0 < A < B < C < 100)

www.acmicpc.net

 

2. 문제 포인트

  • 캥거루는 3마리의 위치를 입력 받는다
  • 캥거루가 뛰는 위치는 다른 캥거루 2마리 사이다
    • 사이 좌표는 무관하다 (문제 조건에서 최대 가능 횟수를 묻기 때문에 최적의 위치로 생각한다)
  • 최대 캥거루의 점프 횟수를 출력한다

 

3. 접근법

  • 캥거루의 점프 횟수 규칙 찾기

  • 첫번째 Case
    • '캥1'과 '캥2' 사이에는 공간이 없기에 이동이 불가능
    • '캥2'와 '캥3' 사이에 공간이 한개이기에 한번만 이동 가능
  • 두번째 Case
    • '캥1'과 '캥2' 사이에 공간이 존재 (1칸)
      '캥1'과 '캥2' 사이에 '캥3'이 오게 되면 이동 횟수 1회로 종료
    • '캥2'와 '캥3 사이에 공간(2칸)으로 '캥1'이 이동
      위의 이미지와 같이 '캥1'이 최적의 위치로 이동하게되면 총 이동 가능 횟수 2회로 종료
    • 결과적으로 "최대 이동 가능 횟수 = max((캥1 위치 - 캥2 위치), (캥2 위치 - 캥3 위치)) - 1"

 

 

반응형

 

 

4. 결과 코드

import sys

while True:
	
    # 캥거루 위치값 입력 받기
    a = list(map(int, sys.stdin.readline().split()))
    
    # While을 이용해 입력이 더이상 없으면 종료
    if len(a) < 1:
        break
    
    # 1,2번 캥거루의 간격 차이와 2,3번 캥거루 간격 차이중 max값
    result = max(a[1] - a[0], a[2] - a[1])
    
    # 차이에서 -1한 값을 출력
    print(result - 1)
반응형
반응형

1. 문제

    문어 다리 엮기 문제 (링크 참고)

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

 

21313번: 문어

문어에게 여덟개의 팔이 있다는 사실은 잘 알려져 있다. 하지만 문어들이 자신의 팔들을 1번, 2번, 3번, ..., 8번이라고 부른다는 말은 오늘 처음 들었을 것이다! 단, 시계방향으로 오름차순이라던

www.acmicpc.net

 

2. 문제 포인트

  • 문어의 수(N)는 N(4 ≤ N ≤ 1,000)이다
  • 문어 다리의 번호는 중복이 없다
    • = 같은 숫자가 두번 이상 나오면 안된다
  • 사전상 가장 앞에오는 수열을 찾는다
    • = 최대한 1과 2를 사용해야 한다

 

 

반응형

 

 

3. 접근법

  • 문어 다리를 엮는 패턴 인식하기

  • 문어의 숫자가 짝수인 경우 (N % 2 == 0)
    • 1과 2가 문어의 숫자만큼 반복되면 첫번째 숫자를 찾을 수 있음
  • 문어의 숫자가 홀수인 경우 (N % 2 == 1)
    • 1과 2가 반복하되 마지막 문어는 3번 다리로 1번 문어와 손을 잡아야 한다
    • 사전상 가장 앞 수열은 1과 2를 이용해야 하나 위의 그림에서 5번 문어는 1번과 1번손을 잡을 수 없고(1번문어의 1번손은 2번과 잡음) 2번 손은 4번 문어가 3번과 이미 잡았기에 사용 할 수 없다. 따라서 5번 문어는 3번을 사용해야 한다

4. 결과 코드

import sys

# 문어 수 입력 받기
n = int(sys.stdin.readline().strip())

if n % 2 == 0:  #문어가 짝수인 경우
    # 문어 숫자 만큼 1과 2 반복
    result = [1, 2] * (n//2)
        print(*result)
    
else:  #문어가 홀수인 경우
	# n - 1번째까지 1,2반복
    result = [1,2] * (n//2)
    
    # 마지막 n번째에 3을 추가
    result.append(3)
    print(*result)

print(a)

 

반응형

+ Recent posts