주어지는 문장의 알파벳이 중복되지 않게 나오도록 코드를 만들면 되는 문제이다.

중복된 알파벳이 아니라면 출력문제에 순서대로 삽입시켜주면 된다. 

ex ) 입력 aabbcc ,출력 - >abc  



fun main() {
    var visited = BooleanArray(26) { false }
    val n = readLine()!!.toInt()
    var result = ""
    for (i in 0 until n){
        var word = readLine()!!.replace(" ","")
        for (j in word){
            var k = j.toInt()
            if (visited[k-65] == false){
                result+=j
                visited[k-65]=true
            }


        }
    }
    println(result)
}

입력
13
CITADEL POPPY
H O O U A L I
ARROW MASSAGE
S S N B S C L
SHOULDER BARD
I   O R T T
SQUEAL FRIEZE
  N D A O   X
FILE CLAPTRAP
E U J T I A L
VACCINE CARGO
E K V R A E D
RHYME SPLURGE


출력
CITADELPOYHURWMSGNBQFZXJVK

 

파이썬의 ord함수와 동일한 함수가 존재하느니 찾아봤지만 코틀린에서는 char의 클래스타입을 가지고있는 데이터를 Int로 변환하면 아스키코드값이 나오게 된다. 

'알고리즘 > Baekjoon' 카테고리의 다른 글

백준 1202 보석도둑 python  (0) 2024.05.09
백준 1520 내리막길 python  (0) 2024.05.07
백준 17404 RGB 거리 2  (0) 2024.05.03

문제 링크  - https://www.acmicpc.net/problem/1202

 

처음엔 배낭알고리즘 문제로 생각했으나 조건에 가방에 들어갈 수 있는 보석의 수는 최대 1개인걸 알고 그리디하게 풀면 되는 문제로 파악했다. (조건 최대 30만개 가방 c의 개수가 최대 1억개 , 제한시간 1초 - > dp활용 배낭알고리즘으로 풀게되면 시간초과 예상)

 

생각

1.보석은 무게 기준으로 정렬, 가방도 크기 기준으로 정렬 , 

2.가방들을 하나씩 순회하며 가방보다 적거나 같은 무게를 가진 보석들 중 가치가 가장 큰 보석 담기

3, 보석의 중복을 막기 위해 가방에 담긴 보석의 가치를 0으로 변경

4.가방의 무게 이하로 포함된다면 무게값은 필요가 없고, 가치가 가장 높은것만 고르면 됨

 

 

최초코드

import sys
import heapq
input= sys.stdin.readline


n,k =map(int,input().split())

#각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
#보석은 무게 Mi와 가격 Vi


jewel = [list(map(int,input().split())) for __ in range(n)]

#가방 중복판매 방지 -> 가방에 담은 보석의 가치 0으로 변경



bags = []

for __  in range(k):
    bags.append(int(input().rstrip()))

jewel.sort()
bags.sort()
print(jewel)
print(bags)
values= [] #가치가 제일 큰 보석만 뽑으면 됨

now = 0
result = 0

for bw in bags:
    for i in range(now,len(jewel)):# 틀리는 부분이 여기일거같은데
        if jewel[i][0]<=bw:
            heapq.heappush(values,-jewel[i][1])
        else:
            break
    now = i #가방 범위 이내의 인덱스 모두 방문해야함
    if values: # 0개일떄 인덱스 오류 발생
        result-=heapq.heappop(values)


print(result)





   


10퍼센트에서 틀림

반례

4 4
1 100
10 500
13 300
2 200
13
13
13
13

-> 인덱스를 변수 now가 문제였다 보석 마지막까지 다 순회하고 보석을 values에 모두 넣었다면 더 이상 for문으로 순회하지 말아야하는데 계속해서 마지막 보석을 values에 넣어줘서 문제가 보석값이 복사가 되었다.

 

import sys
import heapq
input= sys.stdin.readline

n,k =map(int,input().split())

#각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
#보석은 무게 Mi와 가격 Vi
jewel = [list(map(int,input().split())) for __ in range(n)]
#가방 중복판매 방지 -> 가방에 담은 보석의 가치 0으로 변경 
bags = []

for __  in range(k):
    bags.append(int(input().rstrip()))

jewel.sort()
bags.sort()

values= [] #가치가 제일 큰 보석만 뽑으면 됨 

now = 0
flag= 0
result = 0

for bw in bags:
    for i in range(now,len(jewel)):# 틀리는 부분이 여기일거같은데
        if flag: # for문 모두 순회했다면 플래그 설정
            break
        if jewel[i][0]<=bw:
            heapq.heappush(values,-jewel[i][1])
            if i == len(jewel)-1:
                flag=1
        else:
            break
    now = i #가방 범위 이내의 인덱스 모두 방문해야함 
    if values: # 0개일떄 인덱스 오류 발생
        result-=heapq.heappop(values)

print(result)

보석을 모두 순회했다면 flag True로 만들어서 더이상 보석을 추가하지 않게 만들었다.

flag 사용말고도 wihle문이나 큐를 통해 원소를 제거하게 만들어도 괜찮을것같다

'알고리즘 > Baekjoon' 카테고리의 다른 글

백준 13776 Alpha Puzzle  (0) 2024.07.10
백준 1520 내리막길 python  (0) 2024.05.07
백준 17404 RGB 거리 2  (0) 2024.05.03

문제 링크 - https://www.acmicpc.net/problem/1520

 

그래프탐색과 방문리스트를 담아서 쓰면 간단하게 풀릴거라 생각했다.

 

최초코드 (틀림)

노드를 탐색하며 지나온 좌표를 리스트에 담아서 종점에 도착하거나 , 이미 지나간 경로의 노드를 방문하면 갖고 있던 배열의 좌표에 가중치를 적용한다.

 

https://www.acmicpc.net/problem/1520
import sys
from collections import deque
input= sys.stdin.readline
from copy import deepcopy 

dy,dx= [0,0,1,-1],[1,-1,0,0]

n,m = map(int,input().split())
 # 중첩되는 경로 도착시, 이미 진행한 경로를 또 지나가면서 탐색함 - > 시간초과
 # 각 좌표에 도착하는 노드를 모두 체크 후 각 노드에 모두 추가하기

matrix = [list(map(int,input().split())) for __ in range(n)]
dp = [[0]*(m) for __ in range(n)]


def check_point(path_matrix):
     for py,px in path_matrix: # 경로 도달시 패스노드 체크
        dp[py][px]+=1
    
def dfs(sy,sx):
    result = 0
    stack = []
    stack.append(((sy,sx,[])))
    while stack:
        y,x,path_matrix = stack.pop()
        for i in range(4):
            ny,nx = y+dy[i],x+dx[i]
            if 0<=ny<n and 0<=nx<m and matrix[ny][nx]<matrix[y][x]:
                if (ny,nx) == (n-1,m-1):
                    check_point(path_matrix)
                    result+=1
                    continue
                elif dp[ny][nx]>0:
                    check_point(path_matrix)
                    result+=dp[ny][nx]
                    continue
                next_path = deepcopy(path_matrix)
                next_path.append((ny,nx))
                stack.append((ny,nx,next_path))
    return result
print(dfs(0,0))

경우의 수가 작은범위에서는 맞았지만 분기가 많은 테스트케이스의 경우에서 값이 달랐다.

ex)

2 18
98 91 89 80 76 74 65 58 50 49 44 32 26 23 17 15 14 8
95 91 83 82 70 67 65 55 54 50 41 27 22 20 14 10 7 3

 

왜인지 생각을 해보니 check_point의 함수에서 값을 1씩 추가해서 문제가 되었다. 현재 도착해서 체크포인트함수에 들어가는 현재노드를 도착할 수 있는 경우의 수를 더해줘야하는데 단순하게 한번 방문하니 1 추가해야지 해서 답이 다르게 나왔다 이후에 변경한 check_point함수

def check_point(path_matrix,padd):
    for py,px in path_matrix: # 경로 도달시 패스노드 체크
       dp[py][px]+=padd # 지나온 경로에 현재 도달 할 수 있는 분기 더해주기

 

코드 변경 후 테스트케이스의 답은 모두 맞았지만 백준 ac에서 40%쯤 시간 초과가 나왔다,

이유는 check_point함수를 for문으로 순회하며 각 노드에 방문값을 계속해서 추가해주는데,  각 좌표에서 범위가 넓어지고 분기가 달라질 수록 경우의수가 커지면 기하급수적으로 방문범위가 넓어지고 중복해서 방문해서 연산횟수가 늘어난다.

 

-> 방문리스트를 갖고 탐색하지말고 방문시 실시간으로 방문횟수 갱신하기

 


#  # 중첩되는 경로 도착시, 이미 진행한 경로를 또 지나가면서 탐색함,
#  # 경로중 분기점일떄 , 분리되어 도착하는 경로 수만 세어서 도착시
#  # 현재 도달가능 경로수 * 도착지점 도달 가능 경로수

import sys
import heapq
input= sys.stdin.readline
from copy import deepcopy 

dy,dx= [0,0,1,-1],[1,-1,0,0]

n,m = map(int,input().split())


matrix = [list(map(int,input().split())) for __ in range(n)]

visited = [[0] * m for __ in range(n)]

def bfs(sy,sx):
    q =[]
    heapq.heappush(q,(-matrix[sy][sx],sy,sx))
    visited[sy][sx]=1
    while q:
        now,y,x =heapq.heappop(q)
        for i in range(4):
            ny,nx = y+dy[i],x+dx[i]
            if 0<=ny<n and 0<=nx<m and matrix[ny][nx]<matrix[y][x]:
                if visited[ny][nx]==0:
                    heapq.heappush(q,(-matrix[ny][nx], ny, nx))
                visited[ny][nx] += visited[y][x]
bfs(0,0)
print(visited)
print(visited[n-1][m-1])

1.시작점에서부터 큰 값을 가지고 작은 값을 탐색해야 하기에 출발 시 제일 큰 값을 가지게 된다.

2. 이를 활용해서 최대힙을 사용하여 제일 큰 값부터 낮은 값으로 내려가며 탐색하기, 

3. 현재 진행 가능한 좌표들중 가장 큰 값을 먼저 진행하여 내림차순으로 탐색을 진행하게 된다, 

4. 이미 지나간 경로를 방문하게 된다면 현재 노드의 분기횟수 +  지나간 노드의 분기횟수를 더해주며 visited값 갱신

5. n-1,m-1 마지막지점에 지나갈 수 있는 경로의 수 리턴

'알고리즘 > Baekjoon' 카테고리의 다른 글

백준 13776 Alpha Puzzle  (0) 2024.07.10
백준 1202 보석도둑 python  (0) 2024.05.09
백준 17404 RGB 거리 2  (0) 2024.05.03

 

조건

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

1번과 N번집의 색이 달라하여 인접한 집끼리는 같은 색을 가지면 안된다.

 

문제 생각

1번 집의 색을 정함으로써 1번집의 비용과 마지막 집의 비용 범위 (첫번째 집 비용 제외 나머지 두개)를 결정하게 된다

 

1.첫집의 최소 비용을 결정 한 후 각 분기별로 최소 비용값 탐색하기 , 

 

 

 최선인지 확인하며 분기탐색하기  (n번값 선택시 나눠지는 분기값 + 그다음분기값) 

각 범위의 값을 탐색하며 최소값 구하기 

각 집의 색 범위 안에서 최소값 갱신하며 첫 집을 선택분기로 최소값 구하기

import sys
input =sys.stdin.readline

INF = 400000000
n= int(input())

color_values = [list(map(int,input().split())) for __ in range(n)]


#시작과 끝은 색이 달라야한다.
#각 노드의 인접노드와 색이 달라야한다.

# 시작점과 끝점 값 비교해서 시작값 끝값 절대값으로 결정
# 중간노드 선택 분기 나눠서 가기?
# last_n = {1:[0,2], 2:[1,0],0:[1,2]}

result=INF
for i in range(3):
    dp = [[INF,INF,INF] for __ in range(n)]
    dp[0][i] = color_values[0][i]
    for j in range(1,n):
        dp[j][0] = min(dp[j-1][1],dp[j-1][2]) +color_values[j][0]
        dp[j][1] = min(dp[j-1][0],dp[j-1][2]) +color_values[j][1]
        dp[j][2] = min(dp[j-1][1],dp[j-1][0]) +color_values[j][2]
    dp[j][i] =INF
    curMin  = min(dp[n-1])
    result = min(result,curMin)
print(result)

첫집을 정한 후 진행 가능한 분기에서 최소값 갱신 (첫 출발 집 외의 출발지는 INF값 지정)

최소 값을 갱신하며 INF값의 경로로 들어온 값들은 저절로 걸러지게 된다.

 

마지막집에서 첫집과 같은 색이면 안되기에 처음엔 딕셔너리로 i값에 따라 결정값을 변경하려했다.

다른 사람의 코드를 보고 그냥 간단하게 INF처리를 하게되면 저절로 필터링된다는것을 알고 INF로 처리했다.

 

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

백준 13776 Alpha Puzzle  (0) 2024.07.10
백준 1202 보석도둑 python  (0) 2024.05.09
백준 1520 내리막길 python  (0) 2024.05.07

+ Recent posts