728x90

 

문제 : 14681번: 사분면 고르기 (acmicpc.net)

 

14681번: 사분면 고르기

점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

www.acmicpc.net

 

 

※ 해설과 정답은 아래

 

풀이과정

찻줄 정수x 다음줄 정수y주어진다고 해서 StringTokenizer로 받으면 오답처리 될지도 모름
오답 처리시, BufferedReader 2개로 받아보자

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

int x = 0;
int y = 0;
while(st.hasMoreTokens()){
    x = Integer.parseInt(st.nextToken());
    y = Integer.parseInt(st.nextToken());
}

System.out.println(x);
System.out.println(y);

if( x > 0 && y > 0){
    System.out.print(1);
}else if(x < 0 && y > 0){
    System.out.print(2);
}else if( x < 0 && y < 0){
    System.out.print(3);
}else if(x > 0 && y < 0){
    System.out.print(4);
}else{
    System.out.print("잘못 입력 되어있습니다");
}

인텔리제이에서 돌리면 작동 잘하는데 백준에서 런타임 에러 (NoSuchElement) 발생

아마도 다른 입력 경우의수가 잘못된게 아닌가 싶다

 

BufferedReader 2개 받아 시도

BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));

int x = Integer.parseInt(br1.readLine());
int y = Integer.parseInt(br2.readLine());

if( x > 0 && y > 0){
    System.out.print(1);
}else if(x < 0 && y > 0){
    System.out.print(2);
}else if( x < 0 && y < 0){
    System.out.print(3);
}else if(x > 0 && y < 0){
    System.out.print(4);
}else{
    System.out.print("잘못 입력 되어있습니다");
}

이번에는 런타임 에러(NumberFormat) 발생

런타임에러 : 배열의 크기를 잘못지정하거나 함수가 끝나지 않을 시 발생

 

라고 하는데 배열도 없고 배열로 반환하는 메소드도 없고, 함수도 다 잘 마무리 되었다

뭐가 문제일까?

 

0 입력 방지 + else의 에러메시지가 str이므로 제거 해보자

x,y쪽 br 받는 부분만 for 돌려서 0 안받는 방법?

if( x > 0 && y > 0 && x!=0 && y!=0){
    System.out.print(1);
}else if(x < 0 && y > 0 && x!=0 && y!=0){
    System.out.print(2);
}else if( x < 0 && y < 0 && x!=0 && y!=0){
    System.out.print(3);
}else if(x > 0 && y < 0 && x!=0 && y!=0){
    System.out.print(4);
}else{
    System.out.print("잘못 입력 되어있습니다");
}
int x = 0;
int y = 0;
for(int i=1; i <=2; i++) {
    if(x!=0 && y!=0) {
       x = Integer.parseInt(br1.readLine());
       y = Integer.parseInt(br2.readLine());
    }
}

위의 둘을 적용해도 런타임 에러(NumberFormat) 발생

 

뭐가 문제일까...?

첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)
-> 백준에서 이런 조건이 주어지면 테스트 시, 해당 수의 범위만 테스트한다는 의미
   즉, 0입력을 코드에서 고려할 필요없고, 다른게 문제라는 의미

 

 

 

BufferedReader 2개로 각각 x,y로 받았을 때 런타임에러(NumberFormat) 발생한 이유


백준에서는 파일 형식으로 받는데(IDE에서의 작동방식과 다르다는 의미)
스트림으로 데이터를 받을 때, BufferedReader 2개로 각각 받으면 IDE랑 다르게
파일형식이라 첫줄에 br1이 값을 받아 x로 넘기고 br1 값은 지워지고 br2 받을 때 둘째줄로 넘어가는게 아닌
첫줄에서 시작하고 또한 공백값을 받기에 br2가 공백을 받아 NumberFormat이 발생한 것

br을 두개에서 하나로 줄여서 문제 해결

 


 

 

해설

  • 양수 구분 : 0초과  ex) x > 0
  • 음수 구분 : 0미만  ex) x < 0

BufferedReader생성하여 값을 입력 받고

br.readLine()으로 x,y 각각 값을 입력 받는다

AND(&&)로 x,y의 각각 조건인 양수,음수들을 if문 조건에 넣고

x,y가 각각 양수면 1분면 식으로 조건을 줘도 뽑아내면 된다

 

이때 주의할 점은

첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

라는 조건이 백준에서 주어지면 코드에서는 저 범위와 0에 대해서는 신경 안써도 된다. 즉, 테스트할 때 해당 숫자의 조건만 테스트를 돌리기 때문에 0이 들어오는 경우의 수도 신경 안써도 됐었음

 

 

정답

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
    public static void main(String[] args) throws IOException {

       BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));

        int x = Integer.parseInt(br1.readLine());
        int y = Integer.parseInt(br1.readLine());

        if( x > 0 && y > 0){
            System.out.print(1);
        }else if(x < 0 && y > 0){
            System.out.print(2);
        }else if( x < 0 && y < 0){
            System.out.print(3);
        }else if(x > 0 && y < 0){
            System.out.print(4);
        }else{
            System.out.print("잘못 입력 되어있습니다");
        }

    }
}

 

 

 

 

728x90
반응형
728x90


728x90
반응형

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

22.10.13 운동기록  (0) 2022.10.13
22.10.11 운동기록  (0) 2022.10.11
22.10.08 운동기록  (0) 2022.10.08
22.10.07 운동기록  (0) 2022.10.07
22.10.05 운동기록  (0) 2022.10.05
728x90
인텔리제이에서 돌리면 작동 잘하는데 백준에서 런타임 에러 (NoSuchElement) 발생

 

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


int x = 0;
int y = 0;
while(st.hasMoreTokens()){
    x = Integer.parseInt(st.nextToken());
    y = Integer.parseInt(st.nextToken());
}

System.out.println(x);
System.out.println(y);

if( x > 0 && y > 0){
    System.out.print(1);
}else if(x < 0 && y > 0){
    System.out.print(2);
}else if( x < 0 && y < 0){
    System.out.print(3);
}else if(x > 0 && y < 0){
    System.out.print(4);
}else{
    System.out.print("잘못 입력 되어있습니다");
}
728x90
반응형
728x90

 

값을 입력 받을 때, 

특정 조건의 값을 받고 싶지 않거나 특정 값만 받고 싶을 때

반복문 + if문

반복문 안에 조건문을 넣어서 반복시키면서 if문 안에서 해당 조건이 만족하면

true 조건에 해당 값을 변수에 넣어서 저장하는 방식으로 받으면 된다

 

ex)

int x = 0;
int y = 0;
for(int i=1; i <=2; i++) {
    if(x!=0 && y!=0) {
       x = Integer.parseInt(br1.readLine());
       y = Integer.parseInt(br2.readLine());
    }
}

 

728x90
반응형
728x90


728x90
반응형

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

22.10.11 운동기록  (0) 2022.10.11
22.10.09 운동기록  (0) 2022.10.10
22.10.07 운동기록  (0) 2022.10.07
22.10.05 운동기록  (0) 2022.10.05
22.10.03 운동기록  (0) 2022.10.03
728x90

 

사용 프로그램

eclipse-jee-2022-09-R-win32-x86_64

tomcat9.0

java1.8 amazon correto

 

메세지

javax.el.PropertyNotFoundException: [boardUsername] 특성이 [example.dao.Board] 유형에 없습니다.

 

 

상황

db에 USER_NAME 컬럼을 추가했고 회원명을 추가로 뷰에 보이기 하기 위해 파일들을 수정 중이었음

 

원인

iBatis를 통하여 쿼리를 보내고 dao로 받아오는 과정에서 EL에 지정한 변수명이 틀림

 

해결

<c:forEach var="board" items="${boardList}">
	<tr>
		<td>${board.boardSeq}</td>
		<td>${board.boardType}</td>
		<td>
			<a href="/board/detail?boardSeq=${board.boardSeq}">
				${board.title}
			</a>
		</td>
//	<td>${board.boardUsername }</td> // 오류난 코드
		<td>${board.username }</td>      // 수정코드
		<td>${board.regDate}</td>
	</tr>
</c:forEach>

 

728x90
반응형
728x90
728x90
반응형

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

22.10.09 운동기록  (0) 2022.10.10
22.10.08 운동기록  (0) 2022.10.08
22.10.05 운동기록  (0) 2022.10.05
22.10.03 운동기록  (0) 2022.10.03
22.10.02 운동기록 3대 가볍게  (0) 2022.10.02
728x90

서브쿼리 조건

inner join에 and로 조건 걸어서 from절에서 걸러냄

SELECT
  FAM1.EMP_NO AS 직원번호
, FAM1.FAM_NM AS 쌍둥이1
, FAM2.FAM_NM AS 쌍둥이2
FROM FAM_C FAM1
	INNER JOIN FAM_C FAM2
		ON FAM1.EMP_NO = FAM2.EMP_NO
AND FAM1.FAM_NM <> FAM2.FAM_NM      -- 쌍둥이 이름 같지않게
AND FAM1.REL_TYPE_CD = FAM2.REL_TYPE_CD
AND FAM1.REL_TYPE_CD = 'A27'        -- 자녀조건(A27) 충족
AND FAM1.BIRTH_YMD = FAM2.BIRTH_YMD -- 생년월일 같음=쌍둥이
;

 

Where절 조건

inner join만하고 조건은 where에 넣은 것

FROM FAM_C F1
    JOIN FAM_C F2 ON(F1.EMP_NO = F2. EMP_NO)
WHERE F1.FAM_NM <> F2.FAM_NM
AND F1.REL_TYPE_CD = 'A27'
AND F1.REL_TYPE_CD = F2.REL_TYPE_CD
AND F1.BIRTH_YMD = F2.BIRTH_YMD    
;

 

Q.

서브쿼리로 조건 걸어서 데이터 가져오는 거랑 WHERE절에서 조건 걸어서 데이터 가져오는거랑

뭐가 다를까?

 

A.

서브쿼리

 집합을 줄일 필요가 있을 때 사용

서브쿼리로 대상을 줄여놓고 메인쿼리와 결합되는 형태로 많이 사용

 

WHERE

다른 어플리케이션(ex:java,C)에서 조건 값을 받아야 하는 경우가 多

 

728x90
반응형
728x90


728x90
반응형

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

22.10.08 운동기록  (0) 2022.10.08
22.10.07 운동기록  (0) 2022.10.07
22.10.03 운동기록  (0) 2022.10.03
22.10.02 운동기록 3대 가볍게  (0) 2022.10.02
22.10.01 운동기록  (0) 2022.10.01
728x90

 

JOIN에 AND

SELECT F1.EMP_NO 직원번호, F1.FAM_NM 쌍둥이1, F2.FAM_NM 쌍둥이2, 'Y' "쌍둥이 여부"
FROM FAM_C F1
    JOIN FAM_C F2 ON(F1.EMP_NO = F2. EMP_NO)
AND F1.FAM_NM <> F2.FAM_NM
AND F1.REL_TYPE_CD = 'A27'
AND F1.REL_TYPE_CD = F2.REL_TYPE_CD
AND F1.BIRTH_YMD = F2.BIRTH_YMD
;

 

JOIN + WHERE절에 AND

SELECT F1.EMP_NO 직원번호, F1.FAM_NM 쌍둥이1, F2.FAM_NM 쌍둥이2, 'Y' "쌍둥이 여부"
FROM FAM_C F1
    JOIN FAM_C F2 ON(F1.EMP_NO = F2. EMP_NO)
WHERE F1.FAM_NM <> F2.FAM_NM
AND F1.REL_TYPE_CD = 'A27'
AND F1.REL_TYPE_CD = F2.REL_TYPE_CD
AND F1.BIRTH_YMD = F2.BIRTH_YMD    
;

 

위 둘의 차이는 뭘까?

 

JOIN에 AND 조회 결과

 

JOIN + WHERE절에 AND

 

조회 결과 행(ROW) 수도 같고 직원번호를 하나씩 따져봐도 같다

 

그럼 차이가 없는 걸까?

답은 NO

 

현재는 내부조인(INNER JOIN)이라 차이가 없지만 외부조인(OUTER JOIN)으로 들어가면 달라지게 된다.

FROM절에서 조건을 걸어서 이미 조건대로 걸러지는 것과

FROM절의 데이터를 토대로 WHERE에서 조건을 거는 것의 차이

쿼리의 작동 순서가 FROM절 WHERE절 순이기 때문

 

<쿼리 동작 순서>

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

 

 

728x90
반응형

+ Recent posts