일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- toCharArray
- 문자열
- JavaScript
- 명령어
- 스프링 컨테이너
- 프로그래머스
- 카카오
- 리눅스마스터1급
- Linux
- 코딩테스트
- 리눅스마스터 3과목
- 월간코드챌린지
- 리눅스마스터 1급 정리
- 백준 java
- 리눅스
- Kotlin
- 연습문제
- 고잉버스
- java 백준 1차원 배열
- map
- 스프링 빈
- 개발자 회고록
- 반복문
- 자바
- Java
- GoingBus
- Memoir
- 백준 javascript
- 자바스크립트 코딩의 기술
- 코테
- Today
- Total
hoon's bLog
백준 Java 1차원 배열 10811 본문
문제출처 : https://www.acmicpc.net/problem/10811
이번 포스팅은 실무에서도 꽤나 많이 쓰이는 스킬을 이용해 풀이해보도록 하겠다.
역시 난이도는 ★!!
Get it!!!
[10811] 바구니 뒤집기
<문제>
<Java 풀이>
import java.io.*;
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 n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] basket = new int[n];
//초기 바구니 셋팅
for(int i=0; i < basket.length; i++) {
basket[i] = i+1;
}
for(int j=0; j<m; j++) {
st = new StringTokenizer(br.readLine(), " ");
// 바구니의 넘버링에 -1을 해야 basket 배열의 인덱스가 됨!
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
for(int k=x; k<=y; k++, y--) {
int tmp = basket[k]; // 임시로 바구니의 공을 담을 변수
basket[k] = basket[y]; // 자리바꾸기
basket[y] = tmp; // 임시로 받은 값 넣으면 바뀜
}
}
//하나씩 꺼내서 붙이기
for(int z=0; z<basket.length; z++)
System.out.print(basket[z] + " ");
br.close();
}
}
여기서 핵심은 26번째 라인의 tmp 변수!!
아마 다른 포스팅에서도 임시변수를 부여해서 풀었을 것 같긴한데,
이렇게 임시 변수를 이용해서 푸는 것은 실무에서 빠지지 않고 나오는 방법이다.
예를 들어 임시변수 tmp에 바구니의 0번째 인덱스에 들어있는 공을 담아놓고,
0번째에 1번째 공을 넣으면 0번째에는 1번째 값이 저장된다.(line 27)
이후 1번째에는 0번째 인덱스의 값을 넣어야 하지만 이미 27라인에서 값을 바꿨기 때문에,
미리 저장해 놨던 0번째 인덱스의 값이 들어있는 임시변수 tmp를 1번째에 저장하면 값이 바뀌게 된다.
이렇게 임시 변수를 통해 값을 바꾸거나 옮기는 용도로 자주 사용되고,
이 임시변수의 타입에 따라 그 쓰임새는 다양하다고 할 수 있겠다.
이번엔 같은 문제의 다른 풀이를 보겠다.
<Java 다른 풀이>
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
int n = read();
int[] lst = new int[n];
for (int i = 0; i < n; i++) lst[i] = i + 1;
int m = read();
for (int j = 0; j < m; j++) {
int a = read() - 1;
int b = read() - 1;
for (int l = 0; l < (b - a + 1) / 2; l++) {
int tmp = lst[a + l];
lst[a + l] = lst[b - l];
lst[b - l] = tmp;
}
}
for (int k = 0; k < n; k++) sb.append(lst[k]).append(' ');
System.out.print(sb);
}
static int read() throws IOException{
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 32) n = (n << 3) + (n << 1) + (c & 15);
return n;
}
}
기존의 풀이들과 크게 다르지 않게 여기서도 배열과 반복문을 이용해서 로직을 풀어나간다.
다만 입력방식이 조금 특이한 점을 볼 수 있는데,
25 line에서 구현한 read()
함수를 살펴보자.
26 line : c, n으로 입력받는데, 여기서 System.in.read()
와 & 연산자
를 사용하고 있다.
System.in.read()
- Scanner, BufferedReader를 사용하지 않고 입력값을 받을 수 있다.
- 버퍼(InputStream)를 사용하기 때문에 효율적이며 IOException의 throw를 필수적으로 해주어야 한다.
- 문자를 하나씩만 가져올 수 있고 아스키코드로 변환해 가져온다
- enter도 입력으로 인식되어 아스키코드 10으로 출력된다.
import java.io.IOException;
public class fooNote {
public static void main(String[] args) throws IOException {
int w = System.in.read();
int x = System.in.read();
int y = System.in.read();
int z = System.in.read();
System.out.println(w);
System.out.println(x);
System.out.println(y);
System.out.println(z);
}
}
- 결과
위의 예제와 같이 입력은 4번 받았는데 1, 2만 입력해도 49→10→50→10 이 출력된다.
앞서 말했듯, 1 enter 2 enter로 enter 키가 입력으로 인식되어 아스키코드 10이 출력됨을 볼 수 있다.
그렇다면 다시 위의 코드의 read() function을 가져와서 보면,
static int read() throws IOException{
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 32) n = (n << 3) + (n << 1) + (c & 15);
return n;
}
& 연산자
로 숫자 15를 해주면, 비트논리 연산에 의해 입력한 숫자가 그대로 나오게 된다.
(계산 과정은 밑에 Reference 링크를 참고하길 바란다!)
아스키코드값 0~31은 제어문자, 32는 스페이스이므로 32보다 크면 문자열이라는 뜻!
그래서 while문을 통해 c가 32 미만 아스키코드로 할당되면 더 이상 읽지 않고 반환한다.
어쨌든 장황한 설명이었지만,비트 연산자를 사용하면 buffer를 사용함에 있어 수행속도가 빨라진다고 알고 있으면 되겠다!
하다 보니 Java 메서드와 연산자에 대한 설명이 장황해졌는데,
다음 포스팅에 이어서 Javascript로 풀이를 해보도록 하겠다!
언제나 새로운 정보 공유와 잘못된 정보
비판/지적/태클은 환영입니다!
도움이 되셨다면 공감♥️, 댓글 부탁드려요:)
끝.
Reference
https://coding-factory.tistory.com/521
https://blog.naver.com/jihogrammer/222314445259
'코딩테스트 > 백준' 카테고리의 다른 글
백준 Java & Javascript 1차원 배열 1546 (2) | 2023.09.15 |
---|---|
백준 Javascript 1차원 배열 10811 (1) | 2023.08.10 |
백준 Java & Javascript 1차원 배열 10813, 5597, 3052 (0) | 2023.08.02 |
백준 Java & Javascript 1차원 배열 2562, 10810 (0) | 2023.07.26 |
백준 Java & Javascript 1차원 배열 10807, 10871, 10818 (0) | 2023.07.19 |