728x90

사용 프로그램

Oracle 11g + SQL Developer

 

메세지

ORA-01722: 수치가 부적합합니다

00000 - "invalid number"

*Cause: The specified number was invalid.

*Action: Specify a valid number.

 

상황

자체조인(SELF JOIN) 해볼려고 하던 중 JOIN ON절의 조건을 EMP_NO(사번)과 FAM_NM(가족명) 두가지를 넣었더니 에러 발생

 

원인

EMP_NO(사번)과 FAM_NM(가족명) 둘의 데이터 타입의 다른데 ON절에서 서로를 매칭 시킬려고 해서 에러 발생

※ “ORA-01722: 수치가 부적합 합니다”

 

위 메세지의 에러 원인

1.데이터 타입이 일치 하지 않는경우

2.데이터타입이 다른데 연산을 하는 경우

 

해결

데이터 타입이 다른 두 컬럼을 매핑할려 했던거라 데이터타입이 일치하는 컬럼끼리 매핑 시켜야함

SELECT F1.EMP_NO, F2.FAM_NM
FROM FAM_C F1
    JOIN FAM_C F2 ON(F1.EMP_NO = F2.EMP_NO) 
;

 

728x90
반응형
728x90

 

문제 : 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 (acmicpc.net)

 

3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰

첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다.

www.acmicpc.net

 

 

큰 틀에서의 로직은

갖춰야할 장기말의 수 - 입력 받은 수

           A                      -             B

 

즉 A-B를 각각 배열로 만들어서 for문을 돌려 인덱스번호 별로 호출하여 각 번호를 빼주는 것이다

answer = A[i] - B[i]

 

갖춰야할 장기말의 수 : 변수명 horse

int[] horse = {1,1,2,2,2,8};

입력받은 수 : 변수명 st

StringTokenizer st = new StringTokenizer(br.readLine(), " ");

 

 

st를 변수명 temp에 배열로 집어넣는다 

for(int i=0; i<horse.length;i++){
    temp[i] = Integer.parseInt(st.nextToken());

 

각각을 배열로 만들어서 for문을 배열길이 총6만큼 반복 시켜서 

for문의 i인덱스번호만큼 각 지정 숫자끼리 빼는 것이다

그리고 마지막 출력을 공백 있는 정수나 str로 해야 하기에 배열로 그대로 출력하면 틀리니 주의

(필자가 이래서 틀림처림됨)

        for(int i=0; i<horse.length;i++){
            temp[i] = Integer.parseInt(st.nextToken());
            answer += horse[i] - temp[i] + " ";
        }

 

 

정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int[] horse = {1,1,2,2,2,8};
        int[] temp = new int[6];
        String answer = "";

        for(int i=0; i<horse.length;i++){
            temp[i] = Integer.parseInt(st.nextToken());
            answer += horse[i] - temp[i] + " ";
        }
        System.out.println(answer);

    }
}
728x90
반응형
728x90

 

Scanner + String Class split() 방법을

BufferedReader+StringTokenizer으로 다시 풀어봄

 

BufferedReader의 readLine() 메소드로 입력을 받고 이 값을 담아둔 변수명인 br을 

StringTokenizer 안에 담아둬서 " "으로 구분자 지정하고 나눈다.

ex) 100 100 입력 받았으면 100 사이 공백을 기준으로 100, 100 두 수를 만들게 된다.

이 상태에서 배열에 담아 두 수를 다시 분리할 수 있도록 한다

이후에는 if문 조건

public void method01() throws IOException {
    // Step2-1 1330번 : 두 수 비교하기
    // 조건
    // 한 줄에 두 수 받기

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine()," ");

    int[] num = new int[2];
    for(int i=0; i < num.length;i++){
        num[i] = Integer.parseInt(st.nextToken());
    }
//        System.out.println(Arrays.toString(num));

    int num1 = num[0];
    int num2 = num[1];

    if(num1 > num2){
        System.out.println(">");
    }else if(num1 < num2){
        System.out.println("<");
    }else{
        System.out.println("==");
    }


}

 

728x90
반응형
728x90


728x90
반응형

'small steps > 운동 - 체력이 국력' 카테고리의 다른 글

22.09.30 운동기록  (0) 2022.10.01
22.09.29 운동기록  (0) 2022.09.29
22.09.27 운동기록  (0) 2022.09.27
22.09.26 운동기록  (0) 2022.09.26
22.09.20 운동기록  (0) 2022.09.20
728x90

 

[백준 practice] Step2-2 9498번 : 시험 성적 

BufferedReader로 점수를 입력 받고 if문으로 각 조건별로 등급 출력

public void method02() throws IOException {
    // Step2-2 9498번 : 시험 성적
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int score = Integer.parseInt(br.readLine());

    if(score >= 90){
        System.out.println("A");
    }else if(score >= 80){
        System.out.println("B");
    }else if(score >= 70){
        System.out.println("C");
    }else if(score >= 60){
        System.out.println("D");
    }else{
        System.out.println("F");
    }


}
728x90
반응형
728x90


728x90
반응형

'small steps > 운동 - 체력이 국력' 카테고리의 다른 글

22.09.29 운동기록  (0) 2022.09.29
22.09.28 운동기록  (0) 2022.09.28
22.09.26 운동기록  (0) 2022.09.26
22.09.20 운동기록  (0) 2022.09.20
22.09.16 운동기록  (0) 2022.09.17
728x90

 

https://github.com/neverGiveUpppppp/Comento_SQL_Oracle

 

GitHub - neverGiveUpppppp/Comento_SQL_Oracle: 직무부트캠프 Comento

직무부트캠프 Comento. Contribute to neverGiveUpppppp/Comento_SQL_Oracle development by creating an account on GitHub.

github.com

 

SQL 조회하기 위한 절차

  1. 주어진 조건을 문장화
  2. 문장에서 조건 추리기
  3. 조건을 쿼리문으로 바꿀 수 있는 부분부분 바꾸기

 

1.조회 할 내용 텍스트화

--3-2) 현재 날짜 기준 재직중인 "이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.
--힌트: substr, count(*)를 사용

2.문장에서 쿼리 조건 리스트화

-- 재직중, 현재 날짜 기준, 이씨성, 자녀수

3.각 조건마다 예상되는 쿼리 짜기

-- 재직중 : RETIRE 99/12/31 조건
-- 현재 날짜 기준
-- 이씨성 : LIKE '이%'
-- 자녀수 : COUNT()

 


 

3-2) 현재 날짜 기준 재직중인 “이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.

힌트: substr , count(*)를 사용

-- 재직중 : RETIRE 99/12/31 조건
-- 현재 날짜 기준
-- 이씨성 : LIKE '이%'
-- 자녀수

-- COUNT + LIKE
SELECT E.EMP_NM 직원명, COUNT(*)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT(SUBSTR)+ LIKE
SELECT E.EMP_NM, COUNT(SUBSTR(E.EMP_NM,2,4)) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT + SUBSTR
SELECT E.EMP_NM, COUNT(*) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND SUBSTR(E.EMP_NM, 1,1) = '이'
GROUP BY E.EMP_NM
;

 

3-3) 자녀 명수가 2명 이상인 직원의 리스트를 구하세요.  (직원번호 / 성명 / 자녀명수 )

힌트 having

-- 조회 컬럼 : 직원번호/성명/자녀명수
-- 자녀수 2명 이상 : REL_TYPE_CD A=27이 자녀이므로 이거 2ROW 이상

SELECT E.EMP_NO 직원번호, E.EMP_NM 성명, COUNT(*)
FROM EMP_C E 
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE F.REL_TYPE_CD = 'A27'    -- 자녀(A27) 조건 적용
GROUP BY E.EMP_NO ,E.EMP_NM    
-- 조회에 필요한 EMP_NO,EMP_NM을 조회하기 위해 GROUP BY 사용 필요. 
-- COUNT가 단일행 그룹 함수이기에 단일행 그룹함수 COUNT와 다른 행도 조회하기 위해 사용함
HAVING COUNT(F.REL_TYPE_CD) > 2;

 

3-4) 현재 기준 조직의 부서별 직원이 몇 명인지 구하는 sql을 작성하세요. (조직코드, 조직명, 직원수)

힌트 group by org_cd, org_nm

-- 현재 기준 : ?
-- 부서별 직원 : GROUP BY ORG_NM
-- 부서별 직원 수 : COUNT(*)

SELECT
    org_nm   조직분류,
    COUNT(*) 직원수
FROM
         emp_c e
    JOIN org_c o USING ( org_cd )
GROUP BY
    org_nm;    
;

 


 

전체 쿼리

--3)20210321 기준으로 재직중인 임직원이며,사내부부인 임직원의 직원번호를 구하는 sql을 작성하세요.
--HINT : EMP_C와 FAM_REL_C를 조인해야 합니다.
-- 조회 : 직원번호
-- 재직중 : RETIRE 99/12/31 조건
-- 사내부부 : ? // 일단 EMP_NO = EMP_REL_NO 아님


-- 직원번호와 직원가족번호 =조건 해봤으나 X
SELECT *
FROM EMP_C E
    JOIN FAM_REL_C FR ON(E.EMP_NO = FR.EMP_NO)
WHERE E.EMP_NO = FR.EMP_REL_NO  -- 직원번호와 직원가족번호 =조건 해봤으나 X
;    


SELECT *
FROM EMP_C E
    JOIN FAM_REL_C FR ON(E.EMP_NO = FR.EMP_REL_NO)
WHERE E.EMP_NO = FR.EMP_REL_NO  -- 직원번호와 직원가족번호 =조건 해봤으나 X
;    

SELECT *
FROM EMP_C E
    JOIN FAM_REL_C FR ON(E.EMP_NO = FR.EMP_REL_NO)
WHERE E.EMP_NO = FR.EMP_REL_NO 
AND REL_TYPE_CD IN('A02', 'A18')
;   

SELECT * FROM EMP_C;
SELECT * FROM FAM_C;
SELECT * FROM ORG_C;
SELECT * FROM FAM_REL_C;

SELECT * 
FROM EMP_C  
WHERE EMP_NO = 11501824;
SELECT * 
FROM FAM_C
WHERE EMP_NO = 11501824;
SELECT * 
FROM FAM_REL_C
WHERE EMP_NO = 11501824;




--3-2) 현재 날짜 기준 재직중인 "이씨 성"을 가진 직원의 자녀명수가 몇 명인지 리스트를 만드세요.
--힌트: substr, count(*)를 사용
-- 재직중 : RETIRE 99/12/31 조건
-- 현재 날짜 기준
-- 이씨성 : LIKE '이%'
-- 자녀수

-- 조건 : 재직중+이씨성
SELECT *
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
;    

-- COUNT + LIKE
SELECT E.EMP_NM 직원명, COUNT(*)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT(SUBSTR)+ LIKE
SELECT E.EMP_NM, COUNT(SUBSTR(E.EMP_NM,2,4)) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND E.EMP_NM LIKE '이%'
GROUP BY E.EMP_NM
;    

-- COUNT + SUBSTR
SELECT E.EMP_NM, COUNT(*) AS "자녀명수"
FROM EMP_C E
    JOIN FAM_C F USING(EMP_NO)
WHERE E.RETIRE_YMD = '99991231'
AND SUBSTR(E.EMP_NM, 1,1) = '이'
GROUP BY E.EMP_NM
;  


--3-3) 자녀 명수가 2명 이상인 직원의 리스트를 구하세요.(직원번호?/?성명?/?자녀명수?)
--힌트 having
-- 조회 컬럼 : 직원번호/성명/자녀명수
-- 자녀수 2명 이상 : REL_TYPE_CD A=27이 자녀이므로 이거 2ROW 이상

-- A27타입인 자녀수만 조회
SELECT COUNT(F.REL_TYPE_CD)
FROM EMP_C E
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE F.REL_TYPE_CD = 'A27'    
;

SELECT E.EMP_NO 직원번호, E.EMP_NM 성명, COUNT(*)
FROM EMP_C E 
    JOIN FAM_C F ON(E.EMP_NO = F.EMP_NO)
WHERE F.REL_TYPE_CD = 'A27'    -- 자녀(A27) 조건 적용
GROUP BY E.EMP_NO ,E.EMP_NM    
-- 조회에 필요한 EMP_NO,EMP_NM을 조회하기 위해 GROUP BY 사용 필요. 
-- COUNT가 단일행 그룹 함수이기에 단일행 그룹함수 COUNT와 다른 행도 조회하기 위해 사용함
HAVING COUNT(F.REL_TYPE_CD) > 2 
-- WHERE절에서 자녀있는 직원만 골라낸 후, HAVING으로 2명이상 조건 적용
-- 이후 GROUP BY 직원번호와 성명을 묶어서 조회
;    


SELECT * FROM EMP_C;
SELECT * FROM FAM_C;
SELECT * FROM ORG_C;
SELECT * FROM FAM_REL_C;


--3-4) 현재 기준 조직의 부서별 직원이 몇 명인지 구하는 sql을 작성하세요. (조직코드, 조직명, 직원수)
--힌트 group by org_cd, org_nm
-- 현재 기준 : ?
-- 부
-- 부서별 직원 수 : COUNT(*)서별 직원 : GROUP BY ?(ORG..?)
SELECT
    org_nm   조직분류,
    COUNT(*) 직원수
FROM
         emp_c e
    JOIN org_c o USING ( org_cd )
GROUP BY
    org_nm;    
;
728x90
반응형
728x90

 

문제 : 9498번: 시험 성적 (acmicpc.net)

 

9498번: 시험 성적

시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

풀이

스캐너 혹은 버퍼드리더로 숫자를 받는다
  - 버퍼드는 str만 받으므로 int로 형변환해야함
  - 또한, import문 넣을 때도 IOException도 같이 넣어줘야 컴파일 에러 안남
각 점수대 별로 if문으로 점수 분배

 

정답

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int score = Integer.parseInt(br.readLine());


        if(score >= 90){
            System.out.println("A");
        }else if(score >= 80){
            System.out.println("B");
        }else if(score >= 70){
            System.out.println("C");
        }else if(score >= 60){
            System.out.println("D");
        }else{
            System.out.println("F");
        }
    }
}

 

 

728x90
반응형
728x90


728x90
반응형

'small steps > 운동 - 체력이 국력' 카테고리의 다른 글

22.09.28 운동기록  (0) 2022.09.28
22.09.27 운동기록  (0) 2022.09.27
22.09.20 운동기록  (0) 2022.09.20
22.09.16 운동기록  (0) 2022.09.17
22.09.15 운동기록  (0) 2022.09.15
728x90

 

입력 숫자 : 472, 385

 

-'0'을 해주는건 아스키코드 자동변환을 방지하기 위함

일의 자리수와 472 곱

십의 자리수와 472 곱

백의 자리수와 472 곱

 

Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
String num2 = sc.next(); 

System.out.println(num1 * (num2.charAt(2)-'0'));       
System.out.println(num1 * (num2.charAt(1)-'0'));        
System.out.println(num1 * (num2.charAt(0)-'0'));       
System.out.println(num1 * (Integer.parseInt(num2)));

 

728x90
반응형

+ Recent posts