기록을 남기자

전체 글 186

카테고리 설명
개발,CS,PS 기록을 남기려 합니다.
  • 문제 https://www.acmicpc.net/problem/1181 1181번: 단어 정렬 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다. www.acmicpc.net 알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오. 길이가 짧은 것부터 길이가 같으면 사전 순으로 단, 중복된 단어는 하나만 남기고 제거해야 한다. 입력 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의..

  • 문제 https://www.acmicpc.net/problem/1167 1167번: 트리의 지름 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 www.acmicpc.net 트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오. 입력 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다. 먼저 정점 번호가 주어지..

  • 문제 https://www.acmicpc.net/problem/1158 1158번: 요세푸스 문제 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000) www.acmicpc.net 요세푸스 문제는 다음과 같다. 1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 이다. N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성..

  • 문제 https://www.acmicpc.net/problem/1153 1153번: 네 개의 소수 임의의 자연수가 주어지면, 이를 네 개의 소수의 합으로 분해하는 프로그램을 작성하시오. 예를 들어 38 = 5 + 7 + 13 + 13이 된다. www.acmicpc.net 임의의 자연수가 주어지면, 이를 네 개의 소수의 합으로 분해하는 프로그램을 작성하시오. 예를 들어 38 = 5 + 7 + 13 + 13이 된다. 입력 첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 출력 첫째 줄에 네 개의 소수를 빈 칸을 사이에 두고 순서대로 출력한다. 불가능한 경우는 -1을 출력한다. 코드 def makeprime(n): a=[False, False] + [True]*(n) for i in rang..

  • 문제 https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. 1번 집의 색은 2번 집의 색과 같지 않아야 한다. N번 집의 색은 N-1번 ..

카테고리
작성일
2023. 4. 11. 18:19
작성자
ssun_bear
반응형

문제

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

단, 중복된 단어는 하나만 남기고 제거해야 한다.

입력

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

출력

조건에 따라 정렬하여 단어들을 출력한다.

 

코드

import sys
input=sys.stdin.readline

n=int(input())
word=[input().strip() for _ in range(n)]
A=set(word)
dic={}
for w in A:
    dic[w]=len(w)

dic1=sorted(dic.items(),  key=lambda x: (x[1],x[0]))
for i in dic1:
    print(i[0])

 

문제 해결

파이썬의 딕셔너리, 정렬방법을 활용하여 풀이

집합의 자료구조를 활용하면 시간복잡도 O(1)안에 포함여부(in)을 활용할수 있음을 알고 있으면 좋다

반응형
카테고리
작성일
2023. 4. 11. 18:15
작성자
ssun_bear
반응형

문제

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

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

 

트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.

입력

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.

먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.

출력

첫째 줄에 트리의 지름을 출력한다.

 

코드

import sys
sys.setrecursionlimit(10**9) 
n = int(sys.stdin.readline())

def dfs(x,y):
    for a, b in tree[x]:
        if visited[a]==-1:
            visited[a]=b+y
            dfs(a,b+y)

tree=[[] for _ in range(n+1)]
for i in range(n):
    data=list(map(int, sys.stdin.readline().split()))
    for j in range(1,len(data)-2,2):
        tree[data[0]].append([data[j], data[j+1]])
        

visited =[-1]*(n+1)
visited[1]=0
dfs(1,0)

s=visited.index(max(visited))
visited =[-1]*(n+1)
visited[s]=0
dfs(s,0)

print(max(visited))

 

문제 해결

dfs 탐색을 통해 첫 번째 노드에서 제일 먼 노드를 찾는다.

첫 번째 노드에서 제일 먼 노드의 번호를 찾는다.

제일 먼 노드의 번호부터 다시 dfs 탐색을 통해 제일 먼 노드를 찾고 그때의 간선의 길이를 출력한다.

반응형
카테고리
작성일
2023. 4. 11. 18:12
작성자
ssun_bear
반응형

문제

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

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

요세푸스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

 

출력

예제와 같이 요세푸스 순열을 출력한다.

 

코드

import sys
input=sys.stdin.readline
from collections import deque
n,k =map(int, input().split())
queue=deque()
for i in range(1,n+1): queue.append(i)
res=[]

while queue:
    for _ in range(k-1):
        queue.append(queue.popleft())
    res.append(queue.popleft())

print(str(res). replace('[', '<'). replace(']', '>'))

 

문제해결

파이썬의 deque(덱)을 활용하는 문제

큐와 스택의 특징을 모두 가지고 있는 자료구조인 deque를 활용하면 쉽게 구현할 수 있다

 

replace()함수를 활용하면 원하는 조건에 출력이 가능하다.

반응형
카테고리
작성일
2023. 4. 11. 18:07
작성자
ssun_bear
반응형

 

문제

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

 

1153번: 네 개의 소수

임의의 자연수가 주어지면, 이를 네 개의 소수의 합으로 분해하는 프로그램을 작성하시오. 예를 들어 38 = 5 + 7 + 13 + 13이 된다.

www.acmicpc.net

임의의 자연수가 주어지면, 이를 네 개의 소수의 합으로 분해하는 프로그램을 작성하시오. 예를 들어 38 = 5 + 7 + 13 + 13이 된다.

 

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

 

출력

첫째 줄에 네 개의 소수를 빈 칸을 사이에 두고 순서대로 출력한다. 불가능한 경우는 -1을 출력한다.

 

코드

def makeprime(n):
    a=[False, False] + [True]*(n)
    
    for i in range(2,n+1):
        if a[i]:
            for j in range(2*i, n+1, i):
                a[j]=False

    return a

n=int(input())
answer=''
if n<8:
    print(-1)
elif n%2==1:
    answer = "2 3 "
    n-=5
else:
    answer = "2 2 "
    n-=4

prime = makeprime(n)

for i in range(2, n+1):
    if prime[i] and prime[n-i]:
        answer+= str(i) + ' ' + str(n-i)
        print(answer)
        break

 

문제해결

 

골드바흐의 추측을 응용하는 풀이

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net

-> 모든 짝수는 소수의 두개의 합으로 표현 가능하다.

 

(1) N이 짝수일때 

 

N이 짝수일때는 N-4도 짝수이다. (N-4>=4)

따라서 N-4를 두개의 소수의 합으로 표현하고 (N-4=a+b), 4를 2+2로 표현하면

N=a+b+2+2로 표현할 수 있다.

 

(2) N이 홀수일때

 

N이 홀수일때는 N-5가 짝수가 된다. (N-5>=4)

따라서 N-5를 두개의 소수의 합으로 표현하고 (N-5=a+b), 5를 2+3으로 표현하면

N=a+b+2+3으로 표현할 수 있다.

 

이후 나머지 소수 a, b를 출력하는 함수를 만들어서 해결하였다.

​(기본적으로 에라토스테네스의 체를 활용하여 풀이하는것이 시간복잡도 측면에서 효율적이다)

반응형
카테고리
작성일
2023. 4. 11. 17:59
작성자
ssun_bear
반응형

 

문제

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

 

1149번: RGB거리

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

 

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

 

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

코드

import sys
input=sys.stdin.readline

n=int(input())
data=[list(map(int, input().split())) for _ in range(n)]
dp=[[0]*3 for _ in range(n)]
dp[0]=data[0]
for i in range(1, n):
    for j in range(3):
        if j==0:
            dp[i][j]=data[i][j]+min(dp[i-1][1], dp[i-1][2])
        elif j==1:
            dp[i][j]=data[i][j]+min(dp[i-1][0], dp[i-1][2])
        elif j==2:
            dp[i][j]=data[i][j]+min(dp[i-1][0], dp[i-1][1])

print(min(dp[n-1]))

 

문제 해결

DP를 이용하여 해결

첫 번째는 계산 하지 않고 두번째부터 빨간집일 경우, 초록집일 경우, 파란 집일 경우를 계산 하는데 그 이전 값중 같은 색을 제외한 min값을 더해주는 것을 반복한다,

 

결국 R,G,B 집을 선택한 모든 경우에 대해 최솟값이 더해져서 나오므로 그 중에서 최솟값을 선택하면 된다 

반응형