문제

 

프로그래머스

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

programmers.co.kr

코드

from collections import deque

def solution(s):
    q = deque()
    for i in range(len(s)):
        if(len(q)==0 or s[i]!=q[len(q)-1]):
            q.append(s[i])
        elif(s[i]==q[len(q)-1]):
            q.pop()
    return 1 if len(q)==0 else 0

풀이

  • 문자열에서 연속으로 오는 문자를 제거할 때 전부 제거할 수 있는지를 확인한다.
  • 스택의 개념을 사용하면 손쉽게 풀 수 있음
  1. 스택 역할을 해주기 위해 deque 선언
  2. s문자열을 for문으로 돌면서 문자 제거
    1. q가 비어있거나 q의 마지막 문자와 현재의 문자가 다르면 q에 넣어준다.
    2. 만약 q의 마지막 문자와 현재 문자가 같으면 q를 pop해준다.
  3. 마지막에 q가 비어있을 경우 1을 아닐경우 0을 출력한다.

문제

 

20920번: 영단어 암기는 괴로워

첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단

www.acmicpc.net

코드

import sys
from functools import cmp_to_key

input = sys.stdin.readline

def cmpDic(a,b):
    if(a[1]<b[1]):
        return 1
    elif (a[1]>b[1]):
        return -1
    if(len(a[0])<len(b[0])):
        return 1
    elif(len(a[0])>len(b[0])):
        return -1
    if a>b:
        return 1
    else:
        return -1

N, M= map(int,input().split())
res={}
for i in range(N):
    a=input().rstrip()
    if(len(a)<M):
        continue
    if(a in res):
        res[a]+=1
    else:
        res[a]=1
res = [(k, v) for k, v in res.items()]

res.sort(key=cmp_to_key(cmpDic))
for i,j in res:
    print(i)

풀이

  • 영단어들을 조건에 맞게 정렬시킨다.
  1. N,M을 입력받는다.
  2. N개의 단어를 받으면서 길이가 M 이상인 단어들만 res에 넣어준다.
    1. res는 딕셔너리를 사용해서 여러번 나온 단어들은 +1씩 해준다.
  3. 입력받은 단어들을 (key, value)의 튜플로 이루어진 리스트로 변환한다.
  4. 변환한 리스트를 조건에 맞게 정렬한다
    1. 자주 나오는 단어일수록 앞에 배치한다.
    2. 해당 단어의 길이가 길수록 앞에 배치한다.
    3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
  5. 정렬한 res를 출력한다.

문제

 

22233번: 가희와 키워드

1번째 글을 쓰고 난 후에, 메모장에 있는 키워드는 set, floyd, os가 됩니다. 2번째 글을 쓰고 난 후에, 메모장에 있는 키워드는 set, os가 됩니다. map은 1번째 글과 2번째 글에 중복으로 등장하였음을

www.acmicpc.net

코드

import sys

input = sys.stdin.readline

m, n =map(int,input().rstrip().split())
keyword = {}

unUse=m

for i in range(m):
    keyword[input().rstrip()]=False

for i in range(n):
    memo = input().rstrip().split(',')
    for j in memo:
        if(j in keyword):
            if(not keyword[j]):
                keyword[j]+=True
                unUse-=1
    print(unUse)

풀이

  • 사용되지 않은 키워드의 개수를 구해라
  1. 키워드를 입력받아 딕셔너리 키워드:0 형태로 만들어준다.
  2. unUse , 사용되지 않은 키워드의 개수를 세는 변수는 만들어준다
  3. 블로그에 사용한 키워드를 memo에 입력받고, 언급된 키워드들을 제거해준다.
    1. keyword에 없는 단어들은 체크하지 않는다.
    2. keyword에 있는데 value가 False이 아닌 단어는 이미 한번 이상 사용된 단어이므로 넘어간다.
    3. keyword에 있는 단어인데 value가 False인경우 사용하지 않은 단어이므로 True로 바꿔준 후 unUse-=1을 해준다

문제

 

프로그래머스

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

programmers.co.kr

코드

def solution(dirs):
    answer = 0
    num = {'U':(0,1),'D':(0,-1),'R':(1,0),'L':(-1,0)}
    res={}
    visited = set()
    x, y = 0, 0

    for i in dirs:
        nx, ny = x + num[i][0], y + num[i][1]
        if -5 <= nx <= 5 and -5 <= ny <= 5:
            if ((x, y), (nx, ny)) not in visited:
                answer += 1
                visited.add(((x, y), (nx, ny)))
                visited.add(((nx, ny), (x, y)))
            x, y = nx, ny

    return answer

풀이

  • 중복을 제외하고 방문한 선분을 체크하기
  1. 입력받는 문자열에 따라 이동하는 좌표값 딕셔너리를 구현.
  2. 입력에 따라서 x,y를 움직인다. -5 ~ 5의 범위는 넘어가면 continue 해준다,
  3. set()에 이동좌표를 넣어서 만약 그 좌표가 존재하지 않으면 answer+=1해주고, 존재하면 중복한 값이라고 판단하고 넘어간다.

+ Recent posts