728x90

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

 

문제

ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다.

예를 들어, "Baekjoon Online Judge"를 ROT13으로 암호화하면 "Onrxwbba Bayvar Whqtr"가 된다. ROT13으로 암호화한 내용을 원래 내용으로 바꾸려면 암호화한 문자열을 다시 ROT13하면 된다. 앞에서 암호화한 문자열 "Onrxwbba Bayvar Whqtr"에 다시 ROT13을 적용하면 "Baekjoon Online Judge"가 된다.

ROT13은 알파벳 대문자와 소문자에만 적용할 수 있다. 알파벳이 아닌 글자는 원래 글자 그대로 남아 있어야 한다. 예를 들어, "One is 1"을 ROT13으로 암호화하면 "Bar vf 1"이 된다.

문자열이 주어졌을 때, "ROT13"으로 암호화한 다음 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 알파벳 대문자, 소문자, 공백, 숫자로만 이루어진 문자열 S가 주어진다. S의 길이는 100을 넘지 않는다.

 

출력

첫째 줄에 S를 ROT13으로 암호화한 내용을 출력한다.

 

예제 입력 1

Baekjoon Online Judge

 

예제 출력 1

Onrxwbba Bayvar Whqtr

 

예제 입력 2

One is 1

 

예제 출력 2

Bar vf 1

 

정답

S = input()
answer = ''

for i in range(len(S)):
    if(S[i].isalpha()): #알파벳인지 확인
        tmp = ord(S[i])+13
        if (ord(S[i])> 96 and tmp > 122) or (ord(S[i]) < 91 and tmp > 90): #대문자, 소문자를 구별해서 값을 구한다.
            tmp-=26
        answer += chr(tmp)
    else:
        answer += S[i]
print(answer)

 

728x90
728x90

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

 

문제

《보드게임컵》을 준비하다 지친 은하는 보드게임컵 참가자들을 경기장에 몰아넣고 결투를 시키는 게임 《수 나누기 게임》을 만들었습니다.

《수 나누기 게임》의 규칙은 다음과 같습니다.

  • 게임을 시작하기 전 각 플레이어는 1부터 1000000 사이의 수가 적힌 서로 다른 카드를 잘 섞은 뒤 한 장씩 나눠 가집니다.
  • 매 턴마다 플레이어는 다른 플레이어와 한 번씩 결투를 합니다.
  • 결투는 서로의 카드를 보여주는 방식으로 진행되며, 플레이어의 카드에 적힌 수로 다른 플레이어의 카드에 적힌 수를 나눴을 때, 나머지가 0이면 승리합니다. 플레이어의 카드에 적힌 수가 다른 플레이어의 카드에 적힌 수로 나누어 떨어지면 패배합니다. 둘 다 아니라면 무승부입니다.
  • 승리한 플레이어는 1점을 획득하고, 패배한 플레이어는 1점을 잃습니다. 무승부인 경우 점수의 변화가 없습니다.
  • 본인을 제외한 다른 모든 플레이어와 정확히 한 번씩 결투를 하고 나면 게임이 종료됩니다.

《수 나누기 게임》의 결과를 가지고 한별이와 내기를 하던 은하는 게임이 종료되기 전에 모든 플레이어의 점수를 미리 알 수 있을지 궁금해졌습니다. 은하를 위해 각 플레이어가 가지고 있는 카드에 적힌 수가 주어졌을 때, 게임이 종료된 후의 모든 플레이어의 점수를 구해주세요.

 

풀이

N = int(input())
arr = list(map(int,input().split()))
set_arr = set(arr)
max_arr = max(arr)
answer = [0 for _ in range(max_arr+1)]
for i in arr:
    if i == max_arr: continue
    for j in range(2*i, max_arr+1, i):
        if j in set_arr:
            answer[i] += 1
            answer[j] -= 1
            
for i in arr:
    print(answer[i], end = ' ')

제일 큰 수를 기준으로 삼아서, 큰 수를 기준으로 최소한의 계산을 하는 방식으로 풀었습니다.

 

max_arr보다 작을 경우에만 set_arr의 값을 하나씩 비교하는 코드입니다.

set_arr로 만든 이유는 arr를 이중 For문으로 사용할 경우, 시간 초과가 발생하기 때문입니다.

728x90
728x90

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

 

26069번: 붙임성 좋은 총총이

첫번째 줄에는 사람들이 만난 기록의 수 $N\ (1 \le N \le 1\ 000)$이 주어진다. 두번째 줄부터 $N$개의 줄에 걸쳐 사람들이 만난 기록이 주어진다. $i + 1$번째 줄에는 $i$번째로 만난 사람들의 이름 $A_i$

www.acmicpc.net

 

문제

 

총총이는 친구 곰곰이의 소개로 제2회 곰곰컵에 출연할 기회를 얻었다!

총총이는 자신의 묘기인 무지개 댄스를 선보여, 여러분의 환심을 사려 한다. 이 댄스는 중독성이 강하기 때문에, 한번 보게 된 사람은 모두 따라 하게 돼버린다.

 

사람들이 만난 기록이 시간 순서대로 개 주어진다. (총총이는 토끼이지만 이 문제에서는 편의상 사람이라고 가정한다.)

무지개 댄스를 추지 않고 있던 사람이 무지개 댄스를 추고 있던 사람을 만나게 된다면, 만난 시점 이후로 무지개 댄스를 추게 된다.

기록이 시작되기 이전 무지개 댄스를 추고 있는 사람은 총총이 뿐이라고 할 때, 마지막 기록 이후 무지개 댄스를 추는 사람이 몇 명인지 구해보자!

 

입력

첫번째 줄에는 사람들이 만난 기록의 수  (1≤N≤1 000)이 주어진다.

두번째 줄부터 개의 줄에 걸쳐 사람들이 만난 기록이 주어진다. 번째 줄에는 번째로 만난 사람들의 이름가 공백을 사이에 두고 주어진다. 는 숫자와 영문 대소문자로 이루어진 최대 길이 20의 문자열이며, 서로 같지 않다.

총총이의 이름은 ChongChong으로 주어지며, 기록에서 1회 이상 주어진다.

동명이인은 없으며, 사람의 이름은 대소문자를 구분한다. (ChongChong과 chongchong은 다른 이름이다.)

 

출력

마지막 기록 이후 무지개 댄스를 추는 사람의 수를 출력하라.

 

예제 입력 1

12
bnb2011 chansol
chansol chogahui05
chogahui05 jthis
jthis ChongChong
jthis jyheo98
jyheo98 lms0806
lms0806 pichulia
pichulia pjshwa
pjshwa r4pidstart
r4pidstart swoon
swoon tony9402
tony9402 bnb2011

 

예제 출력 1

10

 

정답

answer = []
for i in range(int(input())):
    arr = list(input().split())
    if "ChongChong" in arr:
        answer.extend(arr)
        continue
    for j in arr:
        if j in answer:
            answer.extend(arr)
print(len(set(answer)))

총총이 나왔을 경우부터 answer에 extend를 해준 후 set을 통해 중복제거를 하는 문제입니다.

728x90
728x90

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

 

3049번: 다각형의 대각선

세 대각선이 한 점에서 만나지 않는 볼록 N각형이 주어졌을 때, 대각선의 교차점의 개수를 세는 프로그램을 작성하시오. 아래 그림은 위의 조건을 만족하는 한 육각형의 교차점 그림이다. 모든

www.acmicpc.net

 

문제

세 대각선이 한 점에서 만나지 않는 볼록 N각형이 주어졌을 때, 대각선의 교차점의 개수를 세는 프로그램을 작성하시오.

아래 그림은 위의 조건을 만족하는 한 육각형의 교차점 그림이다.

 

모든 내부각이 180도보다 작은 다각형을 볼록 다각형이라고 한다.

 

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 100)

 

출력

첫째 줄에 교차점의 개수를 출력한다.

 

예제 입력 1

3

 

예제 출력 1

0

 

예제 입력 2

4

 

예제 출력 2

1

 

예제 입력 3

6

 

예제 출력 3

15

 

정답

n = int(input())
print(int(n*(n-1)*(n-2)*(n-3)/24))

 

n의 조합을 기준으로 24로 나누는 되는 문제였습니다.

728x90
728x90

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

 

1531번: 투명

첫째 줄에 N과 M이 주어진다. N은 0보다 크거나 같고, 50보다 작거나 같다. M은 0보다 크거나 같고, 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 종이의 좌표가 주어진다. 왼쪽 아래 모서리의 x, y좌

www.acmicpc.net

 

문제

세준이는 1×1크기의 그림으로 모자이크한 100×100크기의 그림을 가지고 있다. 어느 날 이 모자이크 중 일부 그림이 너무 보기 싫어서 N개의 불투명한 종이로 그림을 가리기 시작했다. 불투명한 종이로 가린다고 항상 그 그림이 안 보이는 것은 아니다. 그 그림의 현재 부분 위에 M개 이하의 종이가 올려져 있으면 그림은 그 부분에서 보이게 된다.

그림의 크기는 100×100이고, N개의 종이는 왼쪽 아래 모서리 좌표와 오른쪽 위 모서리 좌표가 입력으로 들어온다. 또, 종이가 가리는 영역에는 두 모서리의 좌표도 포함된다. 예를 들어, (1,1)부터 (2,2)를 가린다면, 총 4개의 그림이 가려진다. (1,1), (1,2), (2,1), (2,2).

100×100크기의 모자이크 중에 보이지 않는 그림의 개수를 세는 프로그램을 작성하시오.

 

입력

첫째 줄에 N과 M이 주어진다. N은 0보다 크거나 같고, 50보다 작거나 같다. M은 0보다 크거나 같고, 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 종이의 좌표가 주어진다. 왼쪽 아래 모서리의 x, y좌표, 오른쪽 위 모서리의 x, y좌표 순으로 주어진다. 모든 좌표는 100보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 정답을 출력한다.

 

예제 입력 1

3 1
21 21 80 80
41 41 60 60
71 71 90 90

 

예제 출력 1

500

 

 

정답

N, M = map(int,input().split())
arr = [[0]*100 for _ in range(100)]

answer = 0
for _ in range(N):
    x1, y1, x2, y2 = map(int,input().split())
    for i in range(x1, x2+1):
        for j in range(y1, y2+1):
            arr[i-1][j-1] += 1

for i in range(100):
    for j in range(100):
        if arr[i-1][j-1] > M:
            answer+=1

print(answer)
728x90
728x90

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

 

1205번: 등수 구하기

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보

www.acmicpc.net

 

문제

태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.

이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.

예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다

랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.

만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.

 

입력

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.

 

출력

첫째 줄에 문제의 정답을 출력한다.

 

예제 입력 1

3 90 10
100 90 80

 

예제 출력 1

2

 

예제 입력 2

10 1 10
10 9 8 7 6 5 4 3 2 1

 

예제 출력 2

-1

 

예제 입력 3

10 1 10
10 9 8 7 6 5 4 3 3 0

 

예제 출력 3

10

 

예제 입력 4

0 0 50

 

예제 출력 4

1

 

정답

n, score, p = map(int,input().split())
if n == 0:
    print(1)
else:
    arr = list(map(int,input().split()))
    arr.append(score)
    arr.sort(reverse=True)
    if p >= (arr.index(score) + 1):
        if n == p and score <= arr[-1]:
            print(-1)
        else:
            print(arr.index(score)+1)
    else:
        print(-1)

1. n이 0일 경우 1 출력

2. arr에 score를 넣고 역순으로 정렬

3. p의 값에 비교하여 -1 출력

4. index에 값을 찾아서 +1해서 출력

5. 해당 값의 순서가 p보다 작을 경우 -1

728x90
728x90

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

 

2559번: 수열

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기

www.acmicpc.net

 

문제

매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.

예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때,

3 -2 -4 -9 0 3 7 13 8 -3

모든 연속적인 이틀간의 온도의 합은 아래와 같다.

 

이때, 온도의 합이 가장 큰 값은 21이다.

또 다른 예로 위와 같은 온도가 주어졌을 때, 모든 연속적인 5일 간의 온도의 합은 아래와 같으며,

 

이때, 온도의 합이 가장 큰 값은 31이다.

매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.

 

입력

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다.

 

출력

첫째 줄에는 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.

 

예제 입력 1

10 2
3 -2 -4 -9 0 3 7 13 8 -3

 

예제 출력 1

21

 

예제 입력 2

10 5
3 -2 -4 -9 0 3 7 13 8 -3

 

예제 출력 2

31

 

정답

import sys
input = sys.stdin.readline
n, k = map(int,input().split())
arr = list(map(int, input().split()))
answer =[]
answer.append(sum(arr[:k]))
for i in range(n - k):
    answer.append(answer[i] - arr[i] + arr[k+i])
print(max(answer))

누적합을 사용해서 푸는 방식을 선택하였습니다.

k까지의 값을 미리 구한 후 왼쪽을 빼고 오른쪽을 더해서 추가한 후, max값을 구하면 정답입니다.

728x90
728x90

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

 

9507번: Generations of Tribbles

꿍은 군대에서 진짜 할짓이 없다. 그래서 꿍만의 피보나치를 만들어보려고 한다. 기존의 피보나치는 너무 단순해서 꿍은 좀더 복잡한 피보나치를 만들어보고자 한다. 그래서 다음과 같은 피보

www.acmicpc.net

 

문제

꿍은 군대에서 진짜 할짓이 없다. 그래서 꿍만의 피보나치를 만들어보려고 한다. 기존의 피보나치는 너무 단순해서 꿍은 좀더 복잡한 피보나치를 만들어보고자 한다. 그래서 다음과 같은 피보나치를 만들었다. 꿍만의 피보나치 함수가 koong(n)이라고 할 때,

n < 2 :                         1
n = 2 :                         2
n = 3 :                         4
n > 3 : koong(n − 1) + koong(n − 2) + koong(n − 3) + koong(n − 4)

이다.

여러분도 꿍 피보나치를 구해보아라.

 

입력

입력의 첫 번째 줄을 테스트 케이스의 개수 t (0 < t < 69)가 주어진다. 다음 t줄에는 몇 번째 피보나치를 구해야하는지를 나타내는 n(0 ≤ n ≤ 67)이 주어진다.

 

출력

각 테스트 케이스에 대해, 각 줄에 꿍 피보나치값을 출력하라.

 

예제 입력 1

8
0
1
2
3
4
5
30
67

 

예제 출력 1

1
1
2
4
8
15
201061985
7057305768232953720

 

정답

dp = [1,1,2,4]
for _ in range(int(input())):
    n = int(input())
    for i in range(len(dp)-1,n):
        dp.append(dp[i]+dp[i-1]+dp[i-2]+dp[i-3])
    print(dp[n])

꿍피보나치는 앞의 4개의 수를 더한 값이므로 세팅을 해준 후 값을 출력하면 되는 문제였습니다.

728x90
728x90

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

 

25192번: 인사성 밝은 곰곰이

첫번째 새로운 사람이 들어온 뒤  pjshwa, chansol, chogahui05은 모두 곰곰티콘으로 인사했다. 두번째 새로운 사람이 들어온 뒤  pjshwa와 chansol은 다시 곰곰티콘으로 인사했다.

www.acmicpc.net

 

문제

 

알고리즘 입문방 오픈 채팅방에서는 새로운 분들이 입장을 할 때마다 곰곰티콘을 사용해 인사를 한다. 이를 본 문자열 킬러 임스는 채팅방의 기록을 수집해 그 중 곰곰티콘이 사용된 횟수를 구해 보기로 했다.

ENTER는 새로운 사람이 채팅방에 입장했음을 나타낸다. 그 외는 채팅을 입력한 유저의 닉네임을 나타낸다. 닉네임은 숫자 또는 영문 대소문자로 구성되어 있다.

새로운 사람이 입장한 이후 처음 채팅을 입력하는 사람은 반드시 곰곰티콘으로 인사를 한다. 그 외의 기록은 곰곰티콘을 쓰지 않은 평범한 채팅 기록이다.

채팅 기록 중 곰곰티콘이 사용된 횟수를 구해보자!

 

입력

 

첫 번째 줄에는 채팅방의 기록 수를 나타내는 정수  이 주어진다. (1≤N≤100000)

두 번째 줄부터  개의 줄에 걸쳐 새로운 사람의 입장을 나타내는 ENTER, 혹은 채팅을 입력한 유저의 닉네임이 문자열로 주어진다. (1≤문자열 길이≤20)

첫 번째 주어지는 문자열은 무조건 ENTER이다.

 

출력

채팅 기록 중 곰곰티콘이 사용된 횟수를 출력하시오.

 

예제 입력 1

9
ENTER
pjshwa
chansol
chogahui05
lms0806
pichulia
r4pidstart
swoon
tony9402

 

예제 출력 1

8

 

예제 입력 2

7
ENTER
pjshwa
chansol
chogahui05
ENTER
pjshwa
chansol

 

예제 출력 2

5

첫번째 새로운 사람이 들어온 뒤  pjshwa, chansol, chogahui05은 모두 곰곰티콘으로 인사했다.

두번째 새로운 사람이 들어온 뒤  pjshwa와 chansol은 다시 곰곰티콘으로 인사했다.

 

예제 입력 3

3
ENTER
lms0806
lms0806

 

예제 출력 3

1

lms0806은 새로운 사람이 들어왔으므로 처음은 곰곰티콘으로 인사하고, 그 뒤로는 일반 채팅을 했다.

 

정답

import sys
input = sys.stdin.readline

n = int(input())
set_arr = set()
cnt = 0

for _ in range(n):
    user = input().strip()
    if user == 'ENTER':
        cnt += len(set_arr)
        set_arr = set()
    else:
        set_arr.add(user)

cnt += len(set_arr)
print(cnt)

set_arr를 만들어서, ENTER를 받기 전까지 입력을 하고 입력 시 length 덧셈 및 초기화하는 방식을 택했습니다.

728x90
728x90

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

 

28278번: 스택 2

첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 둘째 줄부터 N개 줄에 명령이 하나씩 주어진다. 출력을 요구하는 명령은 하나 이상 주어진다.

www.acmicpc.net

 

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  1. 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
  2. 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
  3. 3: 스택에 들어있는 정수의 개수를 출력한다.
  4. 4: 스택이 비어있으면 1, 아니면 0을 출력한다.
  5. 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.

 

입력

첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)

둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.

출력을 요구하는 명령은 하나 이상 주어진다.

 

출력

출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.

 

예제 입력 1

9
4
1 3
1 5
3
2
5
2
2
5

 

예제 출력 1

1
2
5
3
3
-1
-1

 

 

정답

import sys
input = sys.stdin.readline
arr=[]
for i in range(int(input())):
    tmp = list(map(int,input().split()))
    if tmp[0] == 1:
        arr.append(tmp[1])
    elif tmp[0] == 2:
        if len(arr) > 0:
            print(arr.pop())
        else:
            print(-1)
    elif tmp[0] == 3:
        print(len(arr))
    elif tmp[0] == 4:
        if len(arr) > 0:
            print(0)
        else:
            print(1)
    elif tmp[0] == 5:
        if len(arr) > 0:
            print(arr[-1])
        else:
            print(-1)

1번이 입력될 경우 2개의 값들어오기 때문에, tmp를 list로 받았습니다.

5가지의 입력받는 값에 따로 세팅해주면 정답

728x90
728x90

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

 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net

 

문제

solved.ac는 Sogang ICPC Team 학회원들의 알고리즘 공부에 도움을 주고자 만든 서비스이다. 지금은 서강대뿐만 아니라 수많은 사람들이 solved.ac의 도움을 받아 알고리즘 공부를 하고 있다.

 

ICPC Team은 백준 온라인 저지에서 문제풀이를 연습하는데, 백준 온라인 저지의 문제들에는 난이도 표기가 없어서, 지금까지는 다양한 문제를 풀어 보고 싶더라도 난이도를 가늠하기 어려워 무슨 문제를 풀어야 할지 판단하기 곤란했기 때문에 solved.ac가 만들어졌다. solved.ac가 생긴 이후 전국에서 200명 이상의 기여자 분들께서 소중한 난이도 의견을 공유해 주셨고, 지금은 약 7,000문제에 난이도 표기가 붙게 되었다.

어떤 문제의 난이도는 그 문제를 푼 사람들이 제출한 난이도 의견을 바탕으로 결정한다. 난이도 의견은 그 사용자가 생각한 난이도를 의미하는 정수 하나로 주어진다. solved.ac가 사용자들의 의견을 바탕으로 난이도를 결정하는 방식은 다음과 같다.

  • 아직 아무 의견이 없다면 문제의 난이도는 0으로 결정한다.
  • 의견이 하나 이상 있다면, 문제의 난이도는 모든 사람의 난이도 의견의 30% 절사평균으로 결정한다.

절사평균이란 극단적인 값들이 평균을 왜곡하는 것을 막기 위해 가장 큰 값들과 가장 작은 값들을 제외하고 평균을 내는 것을 말한다. 30% 절사평균의 경우 위에서 15%, 아래에서 15%를 각각 제외하고 평균을 계산한다. 따라서 20명이 투표했다면, 가장 높은 난이도에 투표한 3명과 가장 낮은 난이도에 투표한 3명의 투표는 평균 계산에 반영하지 않는다는 것이다.

제외되는 사람의 수는 위, 아래에서 각각 반올림한다. 25명이 투표한 경우 위, 아래에서 각각 3.75명을 제외해야 하는데, 이 경우 반올림해 4명씩을 제외한다.

마지막으로, 계산된 평균도 정수로 반올림된다. 절사평균이 16.7이었다면 최종 난이도는 17이 된다.

사용자들이 어떤 문제에 제출한 난이도 의견 목록이 주어질 때, solved.ac가 결정한 문제의 난이도를 계산하는 프로그램을 작성하시오.

 

입력

첫 번째 줄에 난이도 의견의 개수 n이 주어진다. (0 ≤ n ≤ 3 × 105)

이후 두 번째 줄부터 1 + n번째 줄까지 사용자들이 제출한 난이도 의견 n개가 한 줄에 하나씩 주어진다. 모든 난이도 의견은 1 이상 30 이하이다.

 

출력

solved.ac가 계산한 문제의 난이도를 출력한다.

 

예제 입력 1

5
1
5
5
7
8

 

예제 출력 1

6

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

 

예제 입력 2

10
1
13
12
15
3
16
13
12
14
15

 

예제 출력 2

13

 

 

정답

import sys
input = sys.stdin.readline
n = int(input())
if n == 0:
    print(n)
    sys.exit()
avg = (int(n*0.15)+1 if (n*0.15)%1>=0.5 else int(n*0.15))
arr = [int(input()) for _ in range(n)]
arr = sorted(arr)[avg:n-avg]
answer = sum(arr)/len(arr)
print(int(answer)+1 if answer%1>=0.5 else int(answer))

1. n일 경우 0 출력 후 종료

2. avg를 구할 때 기존의 round 함수를 쓰지 말 것

3. arr를 정렬 후 절사값 기준으로 슬라이싱

4. answer를 구할 때 기존의 round 함수를 쓰지 말 것 및 출력

728x90
728x90

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

 

2485번: 가로수

첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가

www.acmicpc.net

 

문제

직선으로 되어있는 도로의 한 편에 가로수가 임의의 간격으로 심어져있다. KOI 시에서는 가로수들이 모두 같은 간격이 되도록 가로수를 추가로 심는 사업을 추진하고 있다. KOI 시에서는 예산문제로 가능한 한 가장 적은 수의 나무를 심고 싶다.

편의상 가로수의 위치는 기준점으로 부터 떨어져 있는 거리로 표현되며, 가로수의 위치는 모두 양의 정수이다.

예를 들어, 가로수가 (1, 3, 7, 13)의 위치에 있다면 (5, 9, 11)의 위치에 가로수를 더 심으면 모든 가로수들의 간격이 같게 된다. 또한, 가로수가 (2, 6, 12, 18)에 있다면 (4, 8, 10, 14, 16)에 가로수를 더 심어야 한다.

심어져 있는 가로수의 위치가 주어질 때, 모든 가로수가 같은 간격이 되도록 새로 심어야 하는 가로수의 최소수를 구하는 프로그램을 작성하라. 단, 추가되는 나무는 기존의 나무들 사이에만 심을 수 있다.

 

입력

첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가로수의 위치를 나타내는 정수는 1,000,000,000 이하이다. 가로수의 위치를 나타내는 정수는 모두 다르고, N개의 가로수는 기준점으로부터 떨어진 거리가 가까운 순서대로 주어진다.

 

출력

모든 가로수가 같은 간격이 되도록 새로 심어야 하는 가로수의 최소수를 첫 번째 줄에 출력한다.

 

예제 입력 1

4
1
3
7
13

 

예제 출력 1

3

 

예제 입력 2

4
2
6
12
18

 

예제 출력 2

5

 

 

정답

import math
import sys
input = sys.stdin.readline

N = int(input())
answer = 0
pre_tmp = int(input())
tmp = int(input())
arr = [tmp-pre_tmp]
gcd = arr[-1]
for _ in range(2,N):
    next_tmp = int(input())
    pre_tmp = tmp
    dist = next_tmp - tmp
    tmp = next_tmp
    gcd = math.gcd(gcd,dist)
    arr.append(dist)

for i in range(N-1):
    answer += arr[i]//gcd-1

print(answer)

1. 맨처음 두개의 값을 먼저 입력받아, pre_tmp와 tmp에 세팅

2. arr에 두 값의 차이를 입력하고, gcd에 같은 값을 세팅

3. for문을 이용하여 다음 값을 받아오고 gcd를 사용하여 최소공배수 입력 및  arr에 거리 넣기

4. for문을 이용하여 가로수의 필요값을 받아온다.

5. answer 출력

728x90
728x90

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

 

24313번: 알고리즘 수업 - 점근적 표기 1

f(n) = 7n + 7, g(n) = n, c = 8, n0 = 1이다. f(1) = 14, c × g(1) = 8이므로 O(n) 정의를 만족하지 못한다.

www.acmicpc.net

 

문제

오늘도 서준이는 점근적 표기 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.

알고리즘의 소요 시간을 나타내는 O-표기법(빅-오)을 다음과 같이 정의하자.

O(g(n)) = {f(n) | 모든 n ≥ n0에 대하여 f(n) ≤ c × g(n)인 양의 상수 c와 n0가 존재한다}

이 정의는 실제 O-표기법(https://en.wikipedia.org/wiki/Big_O_notation)과 다를 수 있다.

함수 f(n) = a1n + a0, 양의 정수 c, n0가 주어질 경우 O(n) 정의를 만족하는지 알아보자.

 

입력

첫째 줄에 함수 f(n)을 나타내는 정수 a1, a0가 주어진다. (0 ≤ |ai| ≤ 100)

다음 줄에 양의 정수 c가 주어진다. (1 ≤ c ≤ 100)

다음 줄에 양의 정수 n0가 주어진다. (1 ≤ n0 ≤ 100)

 

출력

f(n), c, n0가 O(n) 정의를 만족하면 1, 아니면 0을 출력한다.

 

예제 입력 1

7 7
8
1

 

예제 출력 1

0

f(n) = 7n + 7, g(n) = n, c = 8, n0 = 1이다. f(1) = 14, c × g(1) = 8이므로 O(n) 정의를 만족하지 못한다.

 

예제 입력 2

7 7
8
10

 

예제 출력 2

1

f(n) = 7n + 7, g(n) = n, c = 8, n0 = 10이다. 모든 n ≥ 10에 대하여 7n + 7 ≤ 8이므로 O(n) 정의를 만족한다.

 

정답

a, b = map(int, input().split())
c = int(input())
d = int(input())
print("1" if a*d+b<=c*d and a<=c else "0")

1. a,b,c,d를 입력받는다.

2. 부등식 조건에 맞게 세팅 후 출력

 

b가 음수일 경우를 생각하여 a<=c의 조건을 추가하는게 포인트

728x90
728x90

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

 

5555번: 반지

당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을

www.acmicpc.net

 

문제

당신은 N개의 반지를 가지고 있다. 각각의 반지는 대문자 10 문자로 이루어진 문자열이 새겨져 있다. 반지는 문자열의 시작과 끝이 연결된 형태로 문자가 새겨져 있다. 반지에 각인된 문자열을 거꾸로 읽는 걱정은 없다.

찾고자하는 문자열이 주어졌을 때 그 문자열을 포함하는 반지가 몇 개인지를 발견하는 프로그램을 작성하라.

 

입력

입력은 총 2 + N 줄 이다.

첫 번째 줄에는 1 자 이상 10 자 이하의 대문자로 구성된 찾고자 하는 문자열이 적혀있다.

두 번째 줄에는 반지의 개수 N (1 ≦ N ≦ 100)이 적혀있다.

2+i 줄(1 ≦ i ≦ N)엔 i개의 반지에 새겨져있고, 10 문자로 이루어진 문자열이 적혀있다.

 

출력

찾고자하는 문자열을 포함 반지의 개수를 나타내는 정수를 한 줄로 출력하라.

 

예제 입력 1

ABCD
3
ABCDXXXXXX
YYYYABCDXX
DCBAZZZZZZ

 

예제 출력 1

2

 

예제 입력 2

XYZ
1
ZAAAAAAAXY

 

예제 출력 2

1

 

예제 입력 3

PQR
3
PQRAAAAPQR
BBPQRBBBBB
CCCCCCCCCC

 

예제 출력 3

2

 

 

정답

st = input()
n = int(input())
answer = 0
for _ in range(n):
    tmp = input()
    tmp = tmp + tmp[:len(st)-1]
    if st in tmp:
        answer+=1
print(answer)

1.st 문자열, n 숫자, answer 0 입력

2. for문을 통해 tmp문자열의 length-1만큼 추가

3. tmp에 st의 문자열이 있는지 확인 후 있다면 +1씩 추가

4. 출력

728x90
728x90

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

 

14582번: 오늘도 졌다

첫 번째 줄에는 9개의 정수가 주어지는데, 오늘 경기에서 울림 제미니스가 1회 초, 2회 초, ..., 9회 초에 낸 득점이 주어진다. 두 번째 줄에도 9개의 정수가 주어지는데, 스타트링크 걸리버스가 1회

www.acmicpc.net

 

문제

프로야구팀 울림 제미니스는 오늘도 졌다. 이번에는 스타트링크 걸리버스의 4번타자가 끝내기 홈런을 쳐서 졌다. 울림 제미니스의 열렬한 팬인 지수는 속으로 화를 참으며 어떤 선수 때문에 졌는지 생각해보았다. 지수는 팀이 역전패를 했다면 불펜 투수의 책임이고, 그렇지 않다면 타자와 선발 투수의 책임이라고 생각했다.

지수는 오늘 경기에서 울림이 어떻게 졌는지 생각해보려 했지만, 기분이 너무 더러워서 뭘 할 의욕이 나지 않았다. 지수를 도와 오늘 경기에서 울림 제미니스가 역전패를 했는지 구하는 프로그램을 작성하여라. 역전패가 성립하려면 경기 도중 울림 제미니스가 이기고 있는 순간이 있어야 한다.

 

입력

첫 번째 줄에는 9개의 정수가 주어지는데, 오늘 경기에서 울림 제미니스가 1회 초, 2회 초, ..., 9회 초에 낸 득점이 주어진다.

두 번째 줄에도 9개의 정수가 주어지는데, 스타트링크 걸리버스가 1회 말, 2회 말, ..., 9회 말에 낸 득점이 주어진다.

한 팀이 한 회에 낸 득점은 모두 0 이상 20 이하이며, 스타트링크 걸리버스의 총 득점이 울림 제미니스의 총 득점보다 많다.

경기는 1회 초->1회 말->2회 초->...->9회 초->9회 말 순서로 진행된다.

 

출력

만약 울림 제미니스가 역전패를 했다면 'Yes'를 출력한다.

그렇지 않으면 'No'를 출력한다.

 

예제 입력 1

1 0 0 0 0 0 2 2 1
0 0 3 0 0 0 0 1 4

 

예제 출력 1

Yes

 

예제 입력 2

0 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 4 0

 

예제 출력 2

No

 

정답

arr_ul = list(map(int,input().split()))
arr_st = list(map(int,input().split()))
check = False
for i in range(9):
    if sum(arr_ul[:i+1]) > sum(arr_st[:i]):
        check = True
        break
print("Yes" if check else "No")

1. 두팀을 각각 입력받아서 숫자형 배열로 설정

2. check로 bool 세팅

3. for문을 사용하여 각각 배열 Sum을 비교

4. 조건 충족시 check True 변경 후 for문 멈춤

5. check가 True일 경우 "Yes" 아닐 경우 "No" 출력

728x90
728x90

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/250137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

처음에 문제를 잘못이해해서, attacks의 공격시간이 배열별로 독립이라고 생각해서 어려운 문제라고 생각을 했었습니다.

생각해야할 조건

- 힐과 상대의 공격에 대한 동시성: 같은 시간에는 존재할 수 없다.

- 최대 회복량: 처음에 주어진 체력이 MAX값으로 진행된다.

 

위처럼 조건을 정리하고 문제를 풀었더니 정답코드를 유추할 수 있었습니다.

 

정답

def solution(bandage, health, attacks):
    max_health = health
    health -= attacks[0][1]
    for i in range(1,len(attacks)):
        tmp = attacks[i][0] - attacks[i-1][0]-1
        health = min(max_health,health + (tmp//bandage[0])*bandage[2] + tmp*bandage[1])
        health -= attacks[i][1]
        
        if health <= 0:
            return -1
        
    return health

막상 풀고 다른 사람 풀이보니까 생각보다 짧은 코드로 잘 해결했다는 뿌듯함이 들었습니다 ㅎㅎ..

이 코드에서는 tmp에 -1을 해주는 것이 포인트

728x90
728x90

문제 출처: https://school.programmers.co.kr/learn/courses/30/lessons/250133?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

1: "Spring is beginning"
2: 3
3: "3"

쉬운 난이도의 문제여서 따로 설명은 추가하지 않겠습니다.

728x90
728x90

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

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

 

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

 

예제 입력 1

5

 

예제 출력 1

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

 

정답

num = int(input())
for i in range(1, num+1):
    print(" "*(num-i)+"*"*(i*2-1))
for i in range(num-1,0,-1):
    print(" "*(num-i)+"*"*(i*2-1))

공백을 생각해서 출력하면 되는 문제였습니다.

728x90
728x90

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

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

 

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

 

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

 

출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.

 

예제 입력 1

3
1
4
5
7
9
6
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

 

예제 출력 1

2
8

 

예제 입력 2

9
30
6
12
10
20
21
11
7
5
28
4
18
29
17
19
27
13
16
26
14
23
22
15
3
1
24
25

 

예제 출력 2

2
8

 

정답

arr = [0]*30
for i in range(28):
    arr[int(input())-1] = 1

for i in range(30):
    if arr[i] == 0:
        print(i+1)

30까지의 arr을 만든 후에, 해당하는 값이 있을 경우 1로 바꿔주고 0을 출력하면 되는 문제였습니다.

728x90
728x90

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

 

2743번: 단어 길이 재기

알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

문제

알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 영어 소문자와 대문자로만 이루어진 단어가 주어진다. 단어의 길이는 최대 100이다.

 

출력

첫째 줄에 입력으로 주어진 단어의 길이를 출력한다.

 

예제 입력 1

pulljima

 

예제 출력 1

8

 

 

정답

print(len(input()))

입력을 받아서 len으로 출력하면 되는 문제였습니다.

728x90

+ Recent posts