BOJ_10819 차이를 최대로 -Python3

문제분석

1. 관찰
- abs(A[0]-A[1]) + abs(A[1] - A[2]) +... + abs(A[N-2]-A[N-1])
- N개의 숫자를 뽑을 수 있는 경우의 수를 모두 고려한다 => N!
- 주어진 수식 for 문으로 구현 => N

- 백트래킹으로 모든 조합 탐색하여 max값 갱신하여 출력

2. 복잡도
- O(N!*N) = 8!*8 >> 가능

3. 자료구조
- 구한 배열: int[]
- 체크처리: int[]

해결코드

import sys
si = sys.stdin.readline

N = int(si())
A = list(map(int, si().split()))

check = [0 for _ in range(N)]
nums = []
ans = 0

def bt():
    global ans
    if len(nums)==N:
        tmp = 0
        for i in range(N-1):
            tmp += abs(nums[i]-nums[i+1])
        ans = max(ans, tmp)
        return
    for i,v in enumerate(A):
        if not check[i]:
            check[i]=1
            nums.append(v)
            bt()
            check[i]=0
            nums.pop()
bt()
print(ans)

'Etc > PS' 카테고리의 다른 글

BOJ_10162 전자레인지 -Python3  (0) 2022.08.11
BOJ_1120 문자열 -Python3  (0) 2022.08.10
BOJ_14697 방 배정하기 -Python3  (0) 2022.08.09
BOJ_3040 백설 공주와 일곱 난쟁이 -Python3  (0) 2022.08.09
BOJ_1977 완전제곱수 -Python3  (0) 2022.08.09

BOJ_14697 방 배정하기 -Python3

문제분석

1. 관찰
- 가능한지 안한지만 출력하면된다.
- A,B,C는 서로 다른 수 이고, 배수이거나 배수가 아닌 경우로 구분할 수 있다. => 시간복잡도를 줄이기 위해서 분기처리 해보았다.
- 다른 숫자에대해서 나올 수 있는 조합을 구한다. => for문
- DP(top-down, botto-up)풀이. 참조: https://skeo131.tistory.com/91

2. 복잡도
- 서로 다른 경우: O(n*n*n) = 300*300*300 보다 작으므로 가능

3. 자료구조
- int

해결코드

import sys
si = sys.stdin.readline

A,B,C,N = map(int, si().split())
flag = False 

if A==1:
    print(1)
else:
    if C%A==0 and B%A==0: # B,C는 A의 배수
        if N%A==0:
            print(1)
        else:
            print(0)
    else:
        if C%B==0: # A,B 조합
            for i in range((N//A)+1):
                for j in range((N//B)+1):
                    if A*i + B*j == N:
                        flag = True
            if flag:
                print(1)
            else:
                print(0)
        else: # A,B,C 조합
            for i in range((N//A)+1):
                for j in range((N//B)+1):
                    for k in range((N//C)+1):
                        if A*i + B*j + C*k == N:
                            flag = True
            if flag:
                print(1)
            else:
                print(0)

'Etc > PS' 카테고리의 다른 글

BOJ_1120 문자열 -Python3  (0) 2022.08.10
BOJ_10819 차이를 최대로 -Python3  (0) 2022.08.10
BOJ_3040 백설 공주와 일곱 난쟁이 -Python3  (0) 2022.08.09
BOJ_1977 완전제곱수 -Python3  (0) 2022.08.09
BOJ_10419 지각 -Python3  (0) 2022.08.07

BOJ_3040 백설 공주와 일곱 난쟁이 -Python3

문제분석

1. 관찰
- 서로 다른 9개중 7개를 만들어야 하므로 2개를 제외하고 합을 구해 100이 되면 출력한다.

2. 복잡도
- O(9C2) = 9!/(2!7!) >> 36 가능

3. 자료구조
- 난쟁이 : int[]

해결코드

import sys
si = sys.stdin.readline

dwarves = list( int(si()) for _ in range(9))
s = sum(dwarves)

for i in range(9):
    for j in range(i+1,9):
        if s-dwarves[i]-dwarves[j] == 100:
            for k in range(9):
                if k == i or k == j:
                    continue
                else: 
                    print(dwarves[k])

'Etc > PS' 카테고리의 다른 글

BOJ_10819 차이를 최대로 -Python3  (0) 2022.08.10
BOJ_14697 방 배정하기 -Python3  (0) 2022.08.09
BOJ_1977 완전제곱수 -Python3  (0) 2022.08.09
BOJ_10419 지각 -Python3  (0) 2022.08.07
BOJ_17173 배수들의 합 -Python3  (0) 2022.08.07

BOJ_1977 완전제곱수 -Python3

문제분석

1. 관찰
- M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합과 그 중 최소값을 찾는다.
- 완전제곱수를 찾는 것이므로 i의 제곱근 범위까지만 탐색한다.

2. 복잡도
- O((N-M+1)*(N**(1/2))) = 1000000*100 >> 100만 가능

3. 자료구조
- 완전제곱수 : int[]

해결코드

import sys
si = sys.stdin.readline

M = int(si())
N = int(si())
nums = []

for i in range(M,N+1):
    for j in range(1,int(i**(1/2))+1):
        if i == j*j:
            nums.append(i)

if nums:
    print(sum(nums))
    print(min(nums))
else:
    print(-1)

'Etc > PS' 카테고리의 다른 글

BOJ_14697 방 배정하기 -Python3  (0) 2022.08.09
BOJ_3040 백설 공주와 일곱 난쟁이 -Python3  (0) 2022.08.09
BOJ_10419 지각 -Python3  (0) 2022.08.07
BOJ_17173 배수들의 합 -Python3  (0) 2022.08.07
BOJ_2309 일곱 난쟁이 -Python3  (2) 2022.08.05

고객등록 입력 화면에서 고객정보저장을 위한 SQL문

INSERT INTO BOOKINFO_TBL VLAUES(?,?,?,?,?,?)

지역별 DM 발송 건수 통계를 구하는 SQL문

- groupby 활용

SELECT t2.area, COUNT(*)
FROM DM_TBL t1 JOIN BOOKINFO_TBL t2
ON t1.custid = t2.custid
GROUP BY t2.area;

1. 고객발송내역 조회 SQL

SELECT t1.dmno, t1.custid, t2.author, TO_CHAR(t1.maildate,'YYYY-MM-DD'),t1.contents,t1.campain
FROM DM_TBL t1 JOIN BOOKINFO_TBL t2
ON t1.custid = t1.custid;

...

 

2. 체크 포인트

- JOIN 구문

tale1 t1 JOIN  table2 t2 ON t1.id=t2.id;

- 별칭(Alias)

위의 JOIN 구문에서 테이블명에 별칭을 주어 칼럼에 접근할 수 있다.

- TO_CHAR()

오라클 기본함수인 to_char()을 활용하여 포멧을 지정해줄 수 있다.

1. 샘플 데이터

- [DM발송내역 샘플 데이터]

DM발송번호 고객ID 발송일자 DM 내용 발송부서 고객등급 캠페인구분
1 aaa 20171201 안녕하세요? 10 1 C1
2 bbb 20171201 안녕하세요? 10 2 C1
3 ccc 20171201 안녕하세요? 10 3 C1
4 ddd 20171224 안녕하세요? 20 V C2
5 eee 20171224 안녕하세요? 20 VV C2
6 fff 20171224 안녕하세요? 30 1 C3

- [도서정보 샘플 데이터]

고객ID 성명 관심상품 전화번호 이메일 거주지역
aaa 김고객 의류 010-1111-1111 aaa@korea.com 서울
bbb 이고객 의류 010-1111-1112 bbb@korea.com 서울
ccc 박고객 식료품 010-1111-1113 ccc@korea.com 경기
ddd 홍고객 공산품 010-1111-1114 ddd@korea.com 대전
eee 조고객 컴퓨터 010-1111-1115 eee@korea.com 대전
fff 백고객 관광 010-1111-1116 fff@korea.com 울산
 

2. DM발송내역정보와 고객정보테이블에 데이터 생성

 
INSERT INTO DM_TBL VALUES (1,'aaa',TO_DATE('20171201','YYYYMMDD'),'안녕하세요?','10','1','C1');
INSERT INTO DM_TBL VALUES (2,'bbb',TO_DATE('20171201','YYYYMMDD'),'안녕하세요?','10','2','C1');
INSERT INTO DM_TBL VALUES (3,'ccc',TO_DATE('20171201','YYYYMMDD'),'안녕하세요?','10','3','C1');
INSERT INTO DM_TBL VALUES (4,'ddd',TO_DATE('20171224','YYYYMMDD'),'안녕하세요?','20','V','C2');
INSERT INTO DM_TBL VALUES (5,'eee',TO_DATE('20171224','YYYYMMDD'),'안녕하세요?','20','VV','C2');
INSERT INTO DM_TBL VALUES (6,'fff',TO_DATE('20171224','YYYYMMDD'),'안녕하세요?','30','1','C3');



INSERT INTO BOOKINFO_TBL VALUES ('aaa','김고객','의류','010-1111-1111','aaa@korea.com','서울');
INSERT INTO BOOKINFO_TBL VALUES ('bbb','이고객','의류','010-1111-1112','bbb@korea.com','서울');
INSERT INTO BOOKINFO_TBL VALUES ('ccc','박고객','식료품','010-1111-1113','ccc@korea.com','경기');
INSERT INTO BOOKINFO_TBL VALUES ('ddd','홍고객','공산품','010-1111-1114','ddd@korea.com','대전');
INSERT INTO BOOKINFO_TBL VALUES ('eee','조고객','컴퓨터','010-1111-1115','eee@korea.com','대전');
INSERT INTO BOOKINFO_TBL VALUES ('fff','백고객','관광','010-1111-1116','fff@korea.com','울산');

 

3. 데이터 확인

SELCT * FROM 테이블명;

1. 요구사항

가. 본 과제에서는 한국백화점 DM발송시스템을 구축을 위한 프로그램이다. DM 발송 대상자 조회, 캠페인 DM 발송 업무로 이루어져 있다. 일자별 DM 발송 대상자 조회 및 ,일자별 DM발송 예약리스트를 조회 할 수 있다.
나. 프로그램 개발을 위해 데이터베이스 설계를 위해 업무요건을 확인하고, 필요한 작업을 수행하시오.

2. 테이블 명세서

- [DM발송내역 테이블 명세서 (테이블 명 : DM_TBL)]

순서 컬럼ID 컬럼명 형태 길이 NULL 비고
1 dmno DM발송번호 number 8 NOT NULL Primary Key
2 custid 고객ID varchar2 10    
3 maildate 발송일자 date      
4 contents DM내용 varchar2 13    
5 dept 발송부서 char 2    
6 grade 고객등급 char 2    
7 campain 캠페인구분 char 2    

- [고객정보 테이블 명세서 (테이블 명 : bookinfo_tbl)]

순서 컬럼ID 컬럼명 형태 길이 NULL 비고
1 custid 고객아이디 varchar2 10 NOT NULL Primary Key
2 author 성명 varchar2 20    
3 goods 관심상품 char 20    
4 phone 전화번호 varchar2 13    
5 email 이메일 varchar2 20    
6 area 거주지역 varchar2 20    

 
 

3. 테이블 생성

- DM발송목록 테이블 생성

CREATE TABLE DM_TBL(
dmno NUMBER(8) NOT NULL PRIMARY KEY,
custid VARCHAR2(10),
maildate DATE,
contents VARCHAR2(13 char),
dept CHAR(2),
grade CHAR(2),
campain CHAR(2)
);

* contents char을 기술해주면 글자수로 13자리가 된다. 그냥 13으로 할 경우 byte 단위 13자리

dmno명을 잘못 입력하여 칼럼명 수정

- 고객정보 테이블 생성

CREATE TABLE BOOKINFO_TBL(
custid VARCHAR2(10) NOT NULL PRIMARY KEY,
author VARCHAR2(20),
goods CHAR(20),
phone VARCHAR2(13),
email VARCHAR2(20),
area VARCHAR2(20)
);

goods 칼럼 자료형을 char(20)으로 변경

4. 테이블 확인

- DESC 테이블명;

1. 다운로드 및 환경 셋팅

1.1 다운로드 및 설치

- [다운로드](https://www.oracle.com/database/technologies/xe-prior-release-downloads.html)

- setup파일 실행하여 System 계정에 쓰일 패스워드 생성하고 설치 완료

- CMD(명령프롬프트)에서 sqlplus 명령어로 설치 확인

1.2 SCOTT 계정 활성화

- 오라클에서 기본적으로 제공하는 계정으로 연습하기에 좋은 샘플 데이터가 들어있다. 

- 오라클 처음 시작 시 SCOTT 계정이 잠겨있는 경우가 많아 명령어로 풀어준다.

- 명령어: ALTER USER SCOTT IDENTIFIED BY TIGER ACCOUNT UNLOCK;

- 만약, SCOTT 계정이 존재하지 않는다고 출력되면 오라클 설치경로에서 scott.sql 파일을 찾아 경로를 입력해 직접 실행한다.

scott 계정이 없는 경우

- 경로: C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql 

- 경로 맨앞에 @를 붙여 sqlplus를 실행중인 CMD창에 입력해준다. 

scott.sql 실행

참조

- https://cceeun.tistory.com/198

 

[Oracle] 오라클 11g Express Edition 설치하기 | 오라클 DB 설치 | Database | 로컬 서버 세팅 | Oracle 11g 다운

PC가 포맷되면서 기존에 깔려있던 자료가 다 날아갔다. 그래서 오라클도 다시 깔아야하는데, oracle 공식 홈페이지에서는 11g, 12c에 대한 Express Edition(무료버전) 배포를 중단하였다. 18c와 21c밖에 존

cceeun.tistory.com

- https://velog.io/@fluffycow/%EC%98%A4%EB%9D%BC%ED%81%B4-SCOTT-%EA%B3%84%EC%A0%95-%ED%99%9C%EC%84%B1%ED%99%94%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

오라클 SCOTT 계정 활성화하는 방법

SCOTT은 오라클에서 기본으로 제공하는 계정입니다. 연습하기에 좋은 샘플 데이터가 들어있어 오라클을 처음 시작하는 학생들이 많이 사용합니다.오라클을 처음으로 시작하면 SCOTT 계정이 잠겨

velog.io

 

BOJ_10419 지각 -Python3

문제분석

1. 관찰
- 교수님이 t시간 만큼 지각으로 하시면, s = t**2 만큼 일찍 끝내주신다.
- 수업시간 = t + t**2 인 경우 수업이 바로 끝날 수 있다.


2. 복잡도
- O(t*c) T*C = 100*10000 >> 가능

3. 자료구조
- 테스트케이스, 수업시간 : int

해결코드

import sys
si = sys.stdin.readline

T = int(si())
for _ in range(T):
    c = int(si()) # 수업시간
    t = 0
    while True:
        t+=1
        if t+t**2 <= c:
            continue
        else:
            print(t-1)
            break

'Etc > PS' 카테고리의 다른 글

BOJ_3040 백설 공주와 일곱 난쟁이 -Python3  (0) 2022.08.09
BOJ_1977 완전제곱수 -Python3  (0) 2022.08.09
BOJ_17173 배수들의 합 -Python3  (0) 2022.08.07
BOJ_2309 일곱 난쟁이 -Python3  (2) 2022.08.05
BOJ_7568 덩치 -Python3  (0) 2022.08.05

BOJ_17173 배수들의 합 -Python3

문제분석

1. 관찰
- 서로다른 M개의 정수 K가 오름차순으로 주어진다.
- 1이상 N 이하인 수의 합을 구해라
=> k의 배수들을 중복없이 모두 찾아 더한다.

2. 복잡도
- O(N*M) = 1000*1000 >> 가능

3. 자료구조
- 배수들 : int[]

해결코드

import sys 
si = sys.stdin.readline

N, M = map(int, si().split())
nums = list(map(int, si().split()))
ans = []

for i in range(1,N+1):
    for j in range(M):
        if i%nums[j] == 0 and i not in ans:
            ans.append(i)
print(sum(ans))

'Etc > PS' 카테고리의 다른 글

BOJ_1977 완전제곱수 -Python3  (0) 2022.08.09
BOJ_10419 지각 -Python3  (0) 2022.08.07
BOJ_2309 일곱 난쟁이 -Python3  (2) 2022.08.05
BOJ_7568 덩치 -Python3  (0) 2022.08.05
BOJ_1436 영화감독 숌 -Python3  (0) 2022.08.05

모듈이란?

소프트웨어 설계에서 기능단위로 분해하고 추상화되어 재사용 및 공유 가능한 수준으로 만들어진 단위
즉, 기능단위로 분해되어있고 추상화되어 재사용 및 공유가 가능하도록 구현된 것

 

그럼 모듈화는 뭔가?

소프트웨어의 성능을 향상시키거나 시스템의 디버깅, 시험, 통합 및 수정을 용이하도록 하는 소프트웨어 설계 기법

 

모듈화를 했을 때의 장점이 뭔가? 

1. 프로그램의 효율적인 관리 및 성능 향상
2. 전체적인 소프트웨어 이해의 용이성 증대 및 복잡성 감소
3. 소프트웨어 시험, 통합, 수정 시 용이성 제공
4. 기능의 분리가 가능하고 인터페이스가 단순
5. 오류의 파급 효과를 최소화
6. 모듈의 재사용 가능으로 개발과 유지보수가 용이
정리해서 말하자면, 기능단위로 분리되어 코드의 복잡도가 감소된다. 따라서, 코드를 이해하기에 용이하고 재사용 및 유지보수에도 좋다.

 

모듈화의 목표는 무엇인가?

- 모듈 간 결합도의 최소화(Lose Coupling)
- 모듈 내 요소들간의 응집도 최대화(Strong Sohension)

BOJ_2309 일곱 난쟁이 -Python3

문제분석

1. 관찰
- 아홉 난쟁이의 키가 중어진다.

!! 잘못 생각 한 풀이 => 난쟁이의 키가 같은 경우를 생각하지 않고 재귀함수로 조합을 구현하려고 했다.
- 9 중 7을 뽑는 모든 경우를 탐색한다. -> 재귀함수로 구현
- 7명의 키 합이 100이 되는 경우 출력한다. -> 7명이 선택된 경우, 합이 100이면 출력

!! 해결 풀이
- 9명중 2을 제거한 모든 경우를 탐색한다.
- 

2. 복잡도
- O(9P2) = (9!)/(2!*8!) >> 가능

3. 자료구조
- 난쟁이 : int[]

해결코드

import sys
si = sys.stdin.readline

dwarves = []
for _ in range(9):
    dwarves.append(int(si()))

dwarves.sort() # 오름차순 정렬

S = sum(dwarves)
sum = 0
for i in range(9):
    for j in range(i+1,9):
        sum = S-dwarves[i]-dwarves[j]
        if sum == 100:
            for d in dwarves:
                if d == dwarves[i]:
                    continue
                if d == dwarves[j]:
                    continue
                else:
                    print(d)
            break
    if sum == 100:
        break

'Etc > PS' 카테고리의 다른 글

BOJ_10419 지각 -Python3  (0) 2022.08.07
BOJ_17173 배수들의 합 -Python3  (0) 2022.08.07
BOJ_7568 덩치 -Python3  (0) 2022.08.05
BOJ_1436 영화감독 숌 -Python3  (0) 2022.08.05
BOJ_2231 분해합 -Python3  (0) 2022.08.05

BOJ_7568 덩치 -Python3

문제분석

1. 관찰
- 키와 몸무게가 모두 큰 경우 덩치를 크다고 판단한다.
- 조건에 해당 될때 +1을 해준다. 

2. 복잡도
- O(N+N**N+N) = 50 +50**50+50 >> 가능

3. 자료구조
- 신체조건 : list[]
- 몸무게가 큰 사람의 수: dict{int:int}

해결코드

from collections import defaultdict
import sys
si = sys.stdin.readline

N = int(si())
p = []
p_dict = defaultdict(int)

for i in range(N):
    p.append(list(map(int,si().split())))
    p_dict[i] =1
for i in range(N):
    for j in range(N):
        if p[i][0] < p[j][0] and p[i][1] < p[j][1]:
            p_dict[i] +=1
for i in p_dict.values():
    print(i, end=" ")

'Etc > PS' 카테고리의 다른 글

BOJ_17173 배수들의 합 -Python3  (0) 2022.08.07
BOJ_2309 일곱 난쟁이 -Python3  (2) 2022.08.05
BOJ_1436 영화감독 숌 -Python3  (0) 2022.08.05
BOJ_2231 분해합 -Python3  (0) 2022.08.05
BOJ_2798 블랙잭 -Python3  (0) 2022.08.04

BOJ_1436 영화감독 숌 -Python3

문제분석

1. 관찰
- 666이 들어간 수를 카운팅
- cnt == N 영화 수 출력 

2. 복잡도
- O(n) 
- N이 10000일때 ans가 266799 임으로 >> 가능

3. 자료구조
- 영화번호, 번째 카운팅: int

해결코드

import sys 
si = sys.stdin.readline

N = int(si())

cnt = 0
ans = 666
while True:
    if "666" in str(ans):
        cnt+=1
    if cnt == N: # N번째 제목에 들어간 수 출력후 loop 종료
        print(ans)
        break
    ans+=1

'Etc > PS' 카테고리의 다른 글

BOJ_2309 일곱 난쟁이 -Python3  (2) 2022.08.05
BOJ_7568 덩치 -Python3  (0) 2022.08.05
BOJ_2231 분해합 -Python3  (0) 2022.08.05
BOJ_2798 블랙잭 -Python3  (0) 2022.08.04
BOJ_1065 한수 -Python3  (0) 2022.08.03

+ Recent posts