[백준-14467] 소가 길을 건너간 이유 1

2024. 11. 25. 14:34·🏴알고리즘

 

https://www.acmicpc.net/problem/14467

문제

닭이 길을 건너간 이유는 과학적으로 깊게 연구가 되어 있지만, 의외로 소가 길을 건너간 이유는 거의 연구된 적이 없다. 이 주제에 관심을 가지고 있었던 농부 존은 한 대학으로부터 소가 길을 건너는 이유에 대한 연구 제의를 받게 되었다.

존이 할 일은 소가 길을 건너는 것을 관찰하는 것이다. 존은 소의 위치를 N번 관찰하는데, 각 관찰은 소의 번호와 소의 위치 하나씩으로 이루어져 있다. 존은 소를 10마리 가지고 있으므로 소의 번호는 1 이상 10 이하의 정수고, 소의 위치는 길의 왼쪽과 오른쪽을 의미하는 0과 1 중 하나다.

이 관찰 기록을 가지고 소가 최소 몇 번 길을 건넜는지 알아보자. 즉 같은 번호의 소가 위치를 바꾼 것이 몇 번인지 세면 된다.

입력

첫 줄에 관찰 횟수 N이 주어진다. N은 100 이하의 양의 정수이다. 다음 N줄에는 한 줄에 하나씩 관찰 결과가 주어진다. 관찰 결과는 소의 번호와 위치(0 또는 1)로 이루어져 있다.

출력

첫 줄에 소가 길을 건너간 최소 횟수를 출력한다.

 

 

//14467-소가 길을 건너간 이유

const input = require('fs')
    .readFileSync('input.txt')
    .toString()
    .trim()
    .split('\n')
    .map(line => line.split(' ').map(Number)); // 바로 숫자로 변환

const records = input.slice(1);  /// slice(start) : start 부터 끝까지 가져옴 [[3,1],[]]

let crossings = 0;
const cowPositions = {};

for (const [cow, position] of records) {
    if (cow in cowPositions) {
        if (cowPositions[cow] !== position) {
            crossings++;
        }
    }
    cowPositions[cow] = position;  // { '3': 1 }
}

console.log(crossings);

 

 

const input = require('fs')
    .readFileSync('input.txt')
    .toString()
    .trim()
    .split('\n')
    .map(line => line.split(' ').map(Number)); // 바로 숫자로 변환

 

입력을 문자열로 변환하고, 앞뒤 공백을 제거한 뒤, 각 줄을 배열의 요소로 나눔

각 줄의 내용을 숫자로 변환하여 2차원 배열로 만든다.

결과 예시: [[3, 1], [3, 0], [6, 0], [2, 1], ...].

 

const records = input.slice(1);  /// slice(start) : start 부터 끝까지 가져옴 [[3,1],[]]

 

첫 번째 줄은 관찰 횟수(N)이므로 제외하고, 나머지 관찰 기록만 records에 저장

예시: [[3, 1], [3, 0], [6, 0], [2, 1], ...].

 

 


let crossings = 0;
const cowPositions = {};

 

 

crossings: 소가 길을 건넌 횟수를 저장할 변수. 처음에는 0으로 초기화.

cowPositions: 각 소의 현재 위치를 저장하는 객체.

  • 키: 소의 번호
  • 값: 해당 소의 현재 위치 (0 또는 1).
 
for (const [cow, position] of records) {
    if (cow in cowPositions) {
        if (cowPositions[cow] !== position) {
            crossings++;
        }
    }
    cowPositions[cow] = position;  // { '3': 1 }  // 현재 위치 업데이트
}

 

 

 

  • for (const [cow, position] of records):
    • records 배열에서 각 소의 번호(cow)와 위치(position)를 반복적으로 탐색.

 

 

for (const [cow, position] of records) { if (cow in cowPositions) { if (cowPositions[cow] !== position) { crossings++; // 소의 위치가 이전과 다르면 길을 건넌 것으로 간주 } } cowPositions[cow] = position; // 현재 위치 업데이트 }
  • 각 관찰 기록을 순회하며 소의 번호(cow)와 위치(position)을 확인합니다.
  • cow in cowPositions: 소가 이전에 관찰된 적이 있는지 확인.
    • 관찰된 적이 있으면:
      • cowPositions[cow] !== position: 이전 위치와 현재 위치를 비교.
      • 다르면 crossings++를 증가.
  • 마지막으로 cowPositions[cow] = position을 통해 소의 현재 위치를 업데이트합니다.

 

 

 

 

 

 

 

 

'🏴알고리즘' 카테고리의 다른 글

[백준-20546] 🐜 기적의 매매법 🐜  (3) 2024.11.25
'🏴알고리즘' 카테고리의 다른 글
  • [백준-20546] 🐜 기적의 매매법 🐜
gprorogpfus
gprorogpfus
:- >
  • gprorogpfus
    gpfusdldks
    gprorogpfus
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • 🎭JavaScript (2)
      • 👚 CSS (1)
      • ⚛️ React (13)
      • 🌃 Next.js (5)
        • 🔜 next.js-study (3)
      • 🥏TypeScript (10)
      • 🏴알고리즘 (2)
      • 🌴트러블슈팅 (3)
      • ⛲ 프로젝트 (6)
        • 👖gproro-shop-app (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Redux
    react
    GIT
    JavaScript
    TypeScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gprorogpfus
[백준-14467] 소가 길을 건너간 이유 1
상단으로

티스토리툴바