hoon's bLog

백준 Java & Javascript 1차원 배열 10813, 5597, 3052 본문

코딩테스트/백준

백준 Java & Javascript 1차원 배열 10813, 5597, 3052

개발한기발자 2023. 8. 2. 10:26
반응형

문제출처 : https://www.acmicpc.net/step/6

 

1차원 배열 단계

배열을 활용하여 서로 다른 값의 개수를 찾는 문제

www.acmicpc.net


저번 포스팅에 이어서 1차원 배열!

1차원 배열의 끝이 보인다!

역시 난이도는 아직까지 수준으로 무난하다!

오히려 Java와 Javascript 두 언어로 다 풀고, 정리해서,

포스팅하는 게 훨씬 오래 걸린다......(그러니 공감/댓글 부탁해요!ㅠㅠ)

자 가보자~!!!

[10813] 공 바꾸기

<문제>

<Java 풀이>

import java.io.*;
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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        // StringTokenizer로 N과 M, " "(공백)으로 구분
        StringTokenizer st = new StringTokenizer(br.readLine()); 

        int N = Integer.parseInt(st.nextToken());   // 1~N개 바구니 갯수
        int M = Integer.parseInt(st.nextToken());   // M번의 공 교환 방법

        // index : 바구니 숫자
        // value : 바구니 안에 들어있는 공 숫자
        int[] basket = new int[N];
        for (int i = 0; i < basket.length; i++) { // 바구니의 공 초기화
            basket[i] = i+1;
        }

        for(int i = 0; i < M; i++) {
            // StringTokenizer로 " "(공백)으로 구분(Default)
            st = new StringTokenizer(br.readLine());		 

            int changeBall1 = Integer.parseInt(st.nextToken());
            int changeBall2 = Integer.parseInt(st.nextToken());
            // 임시변수
            int tmp = basket[changeBall1-1];

            basket[changeBall1-1] = basket[changeBall2-1];
            basket[changeBall2-1] = tmp;

        }

        for(int k = 0; k < basket.length; k++) {
            bw.write(basket[k] + " ");
        }
        br.close();
        bw.flush();
        bw.close();
    }

}
  • 30 line : tmp 변수에 입력받은 changeBall1의 값에 1을 뺀 값이 basket의 index로 사용한다.
  • (여기서 1을 뺀 이유는 배열의 index = 순번-1 이기 때문!!)
  • 32 line :  changeBall1의 위치에 changeBall2의 값을 넣어주고, 앞서 저장했던 tmp에 저장된 값을 changeBall2에 저장!

<Javascript 풀이>

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const [n, m] = input[0].trim().split(' ').map(x => parseInt(x));
const basket = [];

for (let i=0; i < n; i++) {
    basket.push(i+1);
}

for (let i=0; i < m; i++) {
    const [I, J] = input[i+1].trim().split(' ').map(x => parseInt(x));
    let temp = basket[I-1];
    basket[I-1] = basket[J-1];
    basket[J-1] = temp;
}
console.log(basket.join(' '));

자바스크립트 문제 역시 임시 변수(temp)를 이용해 값을 바꿔치기하는 방식은 똑같다!

[5597] 과제 안 내신 분..?

<문제>

<Java 풀이>

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        boolean[] arr = new boolean[30];
        for (int i = 0; i < 28; i++) {
            int n = Integer.parseInt(br.readLine());
            arr[n-1] = true;
        }

        for (int i = 0; i < arr.length; i++) {
            if (!arr[i]){
                bw.write((i+1) + "\n");
                bw.flush();
            }
        }

        br.close();
        bw.close();
    }

}
  • 8~12 line : 문제에서 학생의 출석번호는 최대 30이기 때문에, 배열길이는 30으로 잡고, 학생의 출석번호가 1~30 중에 28개 이므로 for문은 28번만 반복
  • 14~16 line : 배열 길이 만큼 for문을 반복하며, 8~12 라인에서 넣어준 배열 값이 true가 아닌 경우, 해당 index +1을 하여 출력한다.
  • 17 line : close가 있는데 굳이 flush?? 현재 버퍼에 저장되어 있는 내용을 클라이언트로 전송하고 버퍼를 비운다.
  • API에 의하면 OutputStream에 속한 flush()는 출력 스트림과 버퍼된 출력 바이트를 강제로 쓰게 한다.

<Javascript 풀이>

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').map(x => parseInt(x));
let str = ''
let student = [];

let std1 = 0;
let std2 = 0;

for(let i=0; i < 30; i++){
    student[i] = i+1;

    for(let j=0; j < input.length; j++){
        if(input[j] === student[i]){
            student[i] = 0;
            break;
        }
    }

    if(student[i] != 0){
        str = str + student[i] + '\n';
    }

}
    
console.log(str.trim());
  • 9 line : 학생들의 출석번호를 index를 이용해서 저장
  • 11 line : input.length로 입력받은 값들의 길이만큼 for문이 반복되면서, input값과 student의 저장된 값을 확인하고, student 배열에 0을 넣어줌
  • 18~20 line : student 배열이 0이 아니면 개행해서 출력
  • 24 line : 마지막 개행 trim으로 제거

[3052] 나머지

<문제>

<Java 풀이>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < 10; i++) {
            set.add(Integer.parseInt(br.readLine()) % 42);
        }
        System.out.println(set.size());
    }
}
  • 8 line : Set Collection Framework 사용, Set을 이용하면 10번 라인에 중복값이 나와도, 알아서 중복된 값을 추가하지 않는다.
  • 12 line : 중복된 값이 없으므로 set의 size가 출력값이 되겠다.

<Javascript 풀이>

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').map(x => parseInt(x));
var result = []

for (i = 0; i < 10; i++) {
    if (!result.includes(input[i] % 42)) // result 배열에 없으면 추가
        result.push(input[i] % 42)
}

console.log(result.length)
  • 5~6 line : input 배열의 값을 42로 나눈 나머지가 result 배열에 포함되어있지 않으면 push

그래도 문제풀이 후 꼭 이렇게 포스팅을 해주면,

짯던 코드가 디버깅이 되는 것처럼 명확하게 다가오고,

이렇게 기록을 남기면서 공부도 되니 1석 n조다!

아직 문제 풀이 갈 길이 멀다. 계속 달려보자!

언제나 새로운 정보 공유와 잘못된 정보

지적/태클은 환영입니다!

끝.

Reference

https://docs.oracle.com/javase/8/docs/api/index.html

 

Java Platform SE 8

 

docs.oracle.com

728x90
반응형