[백준/Python] 1895 필터, 14888 연산자 끼워넣기

2025. 3. 17. 12:00· Koala - 17기/코딩테스트 심화 스터디

잡설

예전에 풀었던 문제들 다시 풀어봤다. 그냥 푸는것보다 예전보다 빠르거나 숏코딩으로 짜보는 것도 재미있을 것 같아서 옛날에 짠 코드들을 비교해보면서 짜보았다.

문제

1895 필터

풀이

단순하게 3*3 기준으로 생각해보면, 가장자리를 제외한 1~n-1, 1~m-1의 좌표와 그 좌표 주변의 값들만 확인하면 된다. dx, dy를 능숙하게 다룰 수 있는 사람이라면 해당 개념을 이용해 간단하게 해결할 수 있다. 값들의 크기가 그리 크지 않아서 단순하게 매번 배열을 새로 만들던, 슬라이싱을 하던 상관 없이 해결 할 수 있다.

코드

n,m=map(int,input().split())
a=[input().split()for i in range(n)]
x=[0,0,0,1,1,1,-1,-1,-1]
y=[0,1,-1,1,0,-1,1,0,-1]
t=int(input())
s=0
for i in range(1,n-1):
    for j in range(1,m-1):
        s+=sorted([int(a[i+y[d]][j+x[d]])for d in range(9)])[4]>=t
print(s)

잡기술

알아도 쓸모는 없지만, 2차원 배열을 1차원 배열처럼 활용해본적 있는 사람이라면 아이디어를 떠올릴 수 있는 방법이 있다. 굳이 dx,dy를 쓰지 않아도 동일한 기능을 만들 수 있는데,

(arr[i-1+d//3][j-1+d%3])for d in range(9)
이렇게 구현 할 수 있다. 몫과 나머지는 모두 0,1,2 중 하나의 값을 갖게 되고, 9까지 진행하면 각각 0,1,2의 반복과 000111222이렇게 반복이 된다. 이것을 -1과 더해주면 -1 0 1 이렇게 값이 변하게 되면서 9방향 탐색을 가능하게 한다.

잡기술과 코드를 이상하게 짜서 아래와 같이 숏코딩을 할 수 있다. (좋은 방법 아님)

더보기
숏코딩 성공!
J,I=int,input;n,m=map(J,I().split());a=[I().split()for _ in[0]*n];t=J(I());print(sum(sorted([J(a[i-1+d//3][j-1+d%3])for d in range(9)])[4]>=t for i in range(1,n-1)for j in range(1,m-1)))

 

문제

14888 연산자 끼워넣기

풀이

대략적으로 시간복잡도를 계산해보면, 선택지 4개가 최대 10칸(11개의 숫자 사이)에 들어갈 수 있으므로 4^10 대충 2^20이라 생각하면 1000*1000 정도 될 것이다. 실제로는 뒤로가면 남아있는 연산자가 0개인 연산자들이 생기므로 실제 시행 횟수는 저보다도 적을 것이다. 따라서 완전탐색으로 충분히 돌아가는 횟수이므로 완전탐색을 떠올릴 수 있다.

또한 매번 선택지가 분기한다고 생각하면 for문 보다는 재귀를 쓰는 쪽이 나을 것이다. 10중 for문을 쓰고 싶은게 아니라면,
permutations를 사용하는 것도 하나의 방법이 될 수 있다. + + + - - / 이렇게 있으면 여기서 permutation을 통해 모든 경우를 구하는 방법으로 활용할 수도 있다.

재귀로 코드를 구현한다면, 구현상 중요한 것은 최솟값과 최댓값의 갱신과 남아있는 연산자들의 개수 관리이다. 인자로 넘겨서 계산할 수 도 있고, 밖으로 빼서 계산할 수 도 있다.

코드

3년전에 풀었던 코드

#https://www.acmicpc.net/problem/14888

from sys import stdin
input=stdin.readline

n=int(input())

sootja=list(map(int,input().split()))

pl,mi,mu,di=list(map(int,input().split()))

mn=1000000000
mx=-1000000000

def compute(arr,plus,minus,mult,divi):
    global mn,mx
    if len(arr)==1:
        mn=min(arr[0],mn)
        mx=max(arr[0],mx)
        return
    if plus:
        compute([arr[0]+arr[1]]+arr[2:],plus-1,minus,mult,divi)
    if minus:
        compute([arr[0]-arr[1]]+arr[2:],plus,minus-1,mult,divi)
    if mult:
        compute([arr[0]*arr[1]]+arr[2:],plus,minus,mult-1,divi)
    if divi:
        if arr[0]<0:
            arr[0]=-arr[0]
            compute([-(arr[0]//arr[1])]+arr[2:],plus,minus,mult,divi-1)
        else:
            compute([arr[0]//arr[1]]+arr[2:],plus,minus,mult,divi-1)

compute(sootja,pl,mi,mu,di)

print(mx)
print(mn)

아마 이때는 검색을 통해서 짰던 코드로 기억한다. 위와 같이 인자로 넘겨서 코드를 작성할 수 있다. 개인적으로는 가독성은 제일 좋은 것 같다. (60ms)

from sys import stdin
input=stdin.readline

def bt(num,dep):
    global mn,mx
    if dep==n:
        mn=min(num,mn)
        mx=max(num,mx)
        return
    for i in range(3):
        if sachik[i]:
            newnum=eval(str(num)+sts[i]+str(sootja[dep]))
            sachik[i]-=1
            bt(newnum,dep+1)
            sachik[i]+=1
    if sachik[3]:
        sachik[3]-=1
        if num<0:
            bt(-(-num//sootja[dep]),dep+1)
        else:
            bt(num//sootja[dep],dep+1)
        sachik[3]+=1

n=int(input())
sootja=list(map(int,input().split()))
sachik=list(map(int,input().split()))
sts={0:'+',1:'-',2:'*'}

mx=-1e10
mn=1e10
bt(sootja[0],1)

print(mx,mn,sep='\n')

1년전에 짰던 코드, if를 안쓴다고 eval같은 걸 쓰고 있다. 구현상으로는 편하겠다고 썼던 것 같은데 여러모로 최악의 코드인 것 같다. 심지어 3년전 코드보다 한참 느리다.(500ms)

from sys import stdin
input=stdin.readline

def bt(num,dep):
    global mn,mx
    if dep==n:
        mn=min(num,mn)
        mx=max(num,mx)
        return
    for i in range(4):
        if sachik[i]:
            sachik[i]-=1
            bt(sts[i](num,sootja[dep]),dep+1)
            sachik[i]+=1

n=int(input())
sootja=list(map(int,input().split()))
sachik=list(map(int,input().split()))
sts=[lambda x,y: x+y,lambda x,y: x-y,lambda x,y: x*y,lambda x,y:x//y if x>0 else -(-x//y)]

mx=-1e9
mn=1e9
bt(sootja[0],1)

print(mx,mn,sep='\n')

비교적 최근에 짠 코드, 배열에 람다식을 집어넣어 if문을 덜 쓴 코드. 속도는 유의미한 차이는 없지만 조금 더 빠르다.

 

 

저작자표시 (새창열림)

'Koala - 17기 > 코딩테스트 심화 스터디' 카테고리의 다른 글

[백준/Python] 2467번 용액  (0) 2025.03.02
[백준/Python] 17204 죽음의 게임  (0) 2025.03.02
[백준/Python] 5430번 : AC  (0) 2025.03.01
[BOJ/Python3] 13334번 : 철로  (0) 2025.02.25
[백준/Python] 13549번: 숨바꼭질3  (0) 2025.02.23
'Koala - 17기/코딩테스트 심화 스터디' 카테고리의 다른 글
  • [백준/Python] 2467번 용액
  • [백준/Python] 17204 죽음의 게임
  • [백준/Python] 5430번 : AC
  • [BOJ/Python3] 13334번 : 철로
KauKoala
KauKoala
항공대 알고리즘 동아리 Koala 🥰
KauKoala
Koala
KauKoala
전체
오늘
어제
  • 분류 전체보기 (1883)
    • 공지 게시판 (10)
    • 정보 게시판 (8)
    • Codeforce (15)
    • acm-icpc (6)
    • Koala - 1기 (16)
    • Koala - 2기 (111)
      • Programming Contest (1)
      • A반 (20)
      • B반 (39)
      • C반 (22)
      • 기초 강의 (18)
    • Koala - 3기 (10)
      • 기초 스터디 (7)
    • Koala - 4기 (67)
    • Koala - 5기 (144)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (68)
    • Koala - 6기 (102)
      • 기초 알고리즘 스터디 (75)
      • 코딩테스트 준비 스터디 (25)
      • 모의 테스트 스터디 (1)
    • Koala - 7기 (167)
      • 기초 알고리즘 스터디 (97)
      • 코딩테스트 준비 스터디 (68)
      • 모의 테스트 스터디 (1)
    • Koala - 8기 (44)
      • 기초 알고리즘 스터디 (32)
      • 코딩테스트 준비 스터디 (10)
      • 코드포스 버츄얼 스터디 (0)
      • 프로그래머스 LV2 스터디 (0)
    • Koala - 9기 (205)
      • 기초 알고리즘 스터디 (138)
      • 코딩테스트 준비 스터디 (64)
      • 모의테스트 준비 스터디 (1)
    • Koala - 10기 (117)
      • 기초 알고리즘 스터디 (30)
      • 코딩테스트 준비 스터디 (86)
      • 모의테스트 준비 스터디 (1)
    • Koala - 11기 (151)
      • 기초 알고리즘 스터디 (46)
      • 코딩테스트 준비 스터디 (104)
      • 모의테스트 준비 스터디 (1)
    • Koala - 12기 (86)
      • 기초 알고리즘 스터디 (31)
      • 코딩테스트 준비 스터디 (55)
    • Koala - 13기 (119)
      • 기초 알고리즘 스터디 (52)
      • 코딩테스트 준비 스터디 (67)
    • Koala - 14기 (116)
      • 기초 알고리즘 스터디 (39)
      • 코딩테스트 준비 스터디 (77)
    • Koala - 15기 (138)
      • 기초 알고리즘 스터디 (73)
      • 코딩테스트 준비 스터디 (65)
    • Koala - 16기 (47)
      • 코딩테스트 기초 스터디 (16)
      • 코딩테스트 심화 스터디 (31)
    • Koala - 17기 (62)
      • 코딩테스트 기초 스터디 (15)
      • 코딩테스트 심화 스터디 (47)
    • Koala - 18기 (31)
      • 코딩테스트 기초 스터디 (11)
      • 코딩테스트 심화 스터디 (20)
    • Koala - 19기 (38)
      • 코딩테스트 기초 스터디 (7)
      • 코딩테스트 심화 스터디 (31)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 🐨항공대 알고리즘 학회 Koala 3기 모집
  • 🐨항공대 알고리즘 학회 Koala 2기 모집
  • 소모임 소개

인기 글

태그

  • 백준
  • 백트래킹
  • C++
  • 파이썬
  • BOJ
  • BFS
  • dp
  • dfs

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
KauKoala
[백준/Python] 1895 필터, 14888 연산자 끼워넣기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.